仅调用泛型的基本方法

Only base method of generic called

我有以下 "models":

我的基地class:

public abstract class Search : Model
{
    //Properties ...

    public void ShallowCopy(Search reference)
    {
        base.ShallowCopy(reference);

        //Do stuff
    }
}

我继承class:

public class Vehicle : Search
{
    //Properties

    public void ShallowCopy(Vehicle reference)
    {
        base.ShallowCopy(reference);

        //Do stuff
    }
}

我的基础"viewModel"是通用的:

public abstract class MasterDataWithoutAddressViewModel<TPrimaryModel> : MasterDataViewModel<TPrimaryModel> 
    where TPrimaryModel : Search, new()
{
    public void JustAMethod() 
    {
        //do stuff

        foreach (TPrimaryModel primaryModel in primaryModels)
        {
            TPrimaryModel primaryModelCopy = new TPrimaryModel();
            primaryModelCopy.ShallowCopy(primaryModel);
            //Do more stuff
        }
    }
}

我继承"viewModel":

public class VehicleViewModel : MasterDataWithoutAddressViewModel<Vehicle>
{
    //...
}

使用 primaryModelCopy.ShallowCopy(primaryModel); 我希望调用 Vehicle 的 ShallowCopy。然而,只调用了基 class Search 的方法。调试器显示 primaryModelprimaryModelCopy 都来自正确的类型 (Vehicle)。

这是我的 "models" 的完整继承层次结构:

发生这种情况是因为在基类和派生类中具有相同签名的方法之间存在编译时冲突(由于重载解析的行为方式)类。

您需要声明您的方法 virtual,并且 override 它们在派生 类:

基地:

public virtual void ShallowCopy(Search reference)
{
    base.ShallowCopy(reference);

    //Do stuff
}

派生:

public override void ShallowCopy(Search reference)
{
    base.ShallowCopy(reference);

    //Do stuff
}

重载解析在编译时执行,在 JustAMethod 中执行 一次,而不是每个类型参数执行一次。所以primaryModelCopy.ShallowCopy解析为Search.ShallowCopy方法。

这里有两个选项:

  • 您可以使用正常的多态性,使 Search.ShallowCopy 成为虚拟的,并在 Vehicle.ShallowCopy 中覆盖它(这需要在方法中将参数转换回 Vehicle
  • 您可以在 JustAMethod 中使用动态类型来改为在执行时执行重载解析。 (我觉得这不是个好主意,但这是一个选择。)