gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:27:28 27 4
gpt4 key购买 nike

我有一个 objDataModel 类型的变量 UDataModel 继承自 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 processorType= typeOf(UCommandProcessor) 我能够创建

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

但我无法将其强制转换为 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);

类型转换也可能是 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com