仅调用泛型的基本方法
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
的方法。调试器显示 primaryModel
和 primaryModelCopy
都来自正确的类型 (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
中使用动态类型来改为在执行时执行重载解析。 (我觉得这不是个好主意,但这是一个选择。)
我有以下 "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
的方法。调试器显示 primaryModel
和 primaryModelCopy
都来自正确的类型 (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
中使用动态类型来改为在执行时执行重载解析。 (我觉得这不是个好主意,但这是一个选择。)