当我在这种情况下使用反射时,创建的类型可以是许多泛型类型。
BaseStepHandler<BaseStepDataModel> activator = (BaseStepHandler<BaseStepDataModel>)Activator.CreateInstance(....);
创建的实例可以是 BaseStepDataModel 的所有子实例。
BaseStepHandler<OneDataModel><br/>
OR<br/>
BaseStepHandler<TwoDataModel>
OneDataModel 和 TwoDataModel 正在扩展 BaseStepDataModel。
这是我得到的异常:
无法将类型为“....GlobalOnBoardingStepOneHandler”的对象转换为类型“....BaseStepHandler`1[....BaseStepDataModel]”。
这是 GlobalOnBoardingStepOneHandler 的声明。
public class GlobalOnBoardingStepOneHandler : BaseStepHandler<GlobalOnBoardingStepOneDataModel>{}
最佳答案
这里的问题是您期望具体类型泛型参数的 contravariance covariance。
基本上,您永远不会使用具体类型实现您的目标,但有一个解决方法。
你可以这样设计一个标记界面:
public interface IBaseStepHandler<out T> // "out" marks T as covariant
where T : BaseDataModel // Do you have a model base type? ;)
{
// Declare members here
}
在我说“在这里声明成员”的地方,只需声明属于具体基类的成员(我说的是“BaseStepHandler”)。
之后,在您的基类 BaseStepHandler 中实现此接口(interface)。
现在,你可以做你想做的事了:
IBaseStepHandler<BaseDataModel> some = new WhateverBaseStepHandlerClass();
// This is possible because T generic parameter is covariant and it can be casted to `BaseDataModel`, or if you don't provide a `T` generic parameter constraint, you could cast it to `IBaseStepHandler<object>` too!
要了解有关协方差的更多信息,请点击此链接:http://msdn.microsoft.com/en-us/library/ee207183.aspx
关于c# - 如何向上转换泛型类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8989629/