c# - 使用类的类型/字符串名称进行 TypeCast

标签 c# generics reflection

我有一个 UDataModel 类型的变量 objDataModel,它继承自 AbstractDataModel

public class AbstractDataModel
{
    internal string SomeName { get; set; }
}
public class UDataModel: AbstractDataModel
{

}

public class FDataModel: AbstractDataModel
{

}


public class UCommandProcessor : AbstractCommandProcessor<UDataModel>
{

}
public class FCommandProcessor : AbstractCommandProcessor<FDataModel>
{

}
 public abstract class AbstractCommandProcessor<TDataModel> :SomeInterface<TDataModel>
  where TDataModel: AbstractDataModel
 {

 }

我有 UDataModelType 类型的变量,即var tDataModelType= typeOf(UDataModel),我可以使用它来创建其对象。

 var tDataModel = (AbstractDataModel)Activator.CreateInstance(tDataModelType);

我有 UCommandProcessor 类型的变量,即 var handlerType= typeOf(UCommandProcessor) 我能够创建

的对象
 var processor = Activator.CreateInstance(processorType);

但我无法将其 TypeCast 到 UCommandProcessor 中 当我尝试时

var processor = (AbstractCommandProcessor<AbstractDataModel>)Activator.CreateInstance(processorType);

我遇到了异常

Unable to cast object of type 'ABC.Domain.UCommandProcessor' to type 'ABC.Common.Contract.AbstractCommandProcessor`1[ABC.Common.Contract.AbstractDataModel]'.

有没有类似的方法

 var processor = (AbstractCommandProcessor<typeOf(tDataModel )>)Activator.CreateInstance(processorType);

连我都做不到

 var processor = (AbstractCommandProcessor<typeOf(tDataModel )>)Activator.CreateInstance(processorType);

最佳答案

如果转换为 AbstractCommandProcessor<AbstractDataModel>,则转换无法工作您基本上需要协变,仅接口(interface)和委托(delegate)支持协变。在这一行中:

(AbstractCommandProcessor<AbstractDataModel>)Activator.CreateInstance(processorType);

Actor 阵容也可能是 AbstractCommandProcessor<FDataModel>这显然是无效的。我建议创建一个抽象类 AbstractCommandProcessor通用版本从中派生,然后您可以转换为非通用版本:

public abstract class AbstractCommandProcessor {}

public class AbstractCommandProcessor<T> : AbstractCommandProcessor, SomeInterface<T> 
                                           where T: AbstractDataModel

...
var processor = (AbstractCommandProcessor)Activator.CreateInstance(processorType);

编辑:如果您确实不需要类,您可以使其与接口(interface)和协变一起使用:

public interface AbstractDataModel { }
public class UDataModel : AbstractDataModel { }
public class FDataModel : AbstractDataModel { }


public class UCommandProcessor : AbstractCommandProcessor<UDataModel> { }
public class FCommandProcessor : AbstractCommandProcessor<UDataModel> { }
public interface AbstractCommandProcessor<out TDataModel> : SomeInterface<TDataModel>
 where TDataModel : AbstractDataModel
{ }

public interface SomeInterface<out TDataModel> where TDataModel : AbstractDataModel { }

...

var processor = 
  (AbstractCommandProcessor<AbstractDataModel>)Activator.CreateInstance(processorType);

由于协方差,这将起作用( out 关键字意味着您可以使用比通用约束指定的更派生的东西)。

关于c# - 使用类的类型/字符串名称进行 TypeCast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36558153/

相关文章:

c# - 通过 asp.net 3.5 发送电子邮件

java - 不能包含具有不同参数的相同接口(interface)吗?

swift - 如何使用父类(super class)中声明的方法返回子类的实例?

java - 如何改进 2 个对象字段的繁琐比较

java - 内部类中的两个声明的构造函数

c# - Mono.Cecil - 如何获取方法体的简单示例

c# - ASP.NET 5 MVC6 错误 : project is not a web project

c# - 我可以在 EF core asp.net 中使用相同模型创建多个表吗

c# - PetaPoco 存储过程错误 "Incorrect syntax near the keyword ' FROM'。"}

c# - 基于泛型参数实例化具体类c#