只有通用的基本方法叫

时间:2015-02-15 10:38:57

标签: c# generics

我有以下"型号":

我的基类:

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

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

        //Do stuff
    }
}

我的继承课程:

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
        }
    }
}

我的继承&#34; viewModel&#34;:

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

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

这是我&#34;模型的完整继承层次结构&#34;: Inheritance tree

2 个答案:

答案 0 :(得分:4)

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

您需要在派生类中声明方法virtualoverride

基地:

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

    //Do stuff
}

派生:

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

    //Do stuff
}

答案 1 :(得分:2)

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

这里有两个选项:

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