我有一个 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/