我有以下"型号":
我的基类:
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
的方法。调试器显示primaryModel
和primaryModelCopy
都来自正确的类型(Vehicle
)。
这是我&#34;模型的完整继承层次结构&#34;:
答案 0 :(得分:4)
这是因为您的基类和派生类中具有相同签名的方法之间存在编译时冲突(由于重载解析的行为方式)。
您需要在派生类中声明方法virtual
和override
:
基地:
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
中使用动态类型来代替执行时执行重载解析。 (这对我来说不是一个好主意,但这是一个选择。)