c# - 如何向上转换泛型类型参数

标签 c# generics

当我在这种情况下使用反射时,创建的类型可以是许多泛型类型。

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/

相关文章:

ios - Swift 3 Generic 无法转换 UITableViewCell 类型的值

c# - 如何将 "Dictionary<x,Class>"作为字典<x,Interface>”传递?

c# - 通用 C# 代码和加号运算符

java - 泛型接口(interface)方法参数的实际类型

c# - 将 int 转换为 short 会产生意想不到的结果

c# - 无需用户干预即可获取访问 token C# SDK

c# - FormsAuthentication.Authenticate 验证失败

c# - 扫描自定义属性的所有类和方法的最佳实践

c# - 将程序集加载到子 AppDomain 并释放 dll 文件

java - Java 中的泛型方法