C# 是否可以创建一个实例并转换回通用接口类型?
我的项目中有以下接口和类C# 是否可以创建一个实例并转换回通用接口类型?,c#,generics,C#,Generics,我的项目中有以下接口和类 public interface IProcessor<T> : where T:IGenericData { void Process(T data); } public class CompanyADataProcessor : IProcessor<CompanyAData> { void Process(CompanyAData Data); } 公共接口i处理器:其中T:IGenericData { 空洞过程(T
public interface IProcessor<T> : where T:IGenericData
{
void Process(T data);
}
public class CompanyADataProcessor : IProcessor<CompanyAData>
{
void Process(CompanyAData Data);
}
公共接口i处理器:其中T:IGenericData
{
空洞过程(T数据);
}
公共类CompanyDataProcessor:IPProcessor
{
作废处理(公司数据);
}
CompanyData实现IGenericData
我想实现下面的铸造,有可能吗?
(IPProcessor)Activator.CreateInstance(typeof(companyDataProcessor))代码>
更新
我想我完全明白为什么这行不通。我想我需要改变我的设计来解决我目前的问题
基本上,我当前的问题是我们有一个数据文件处理器,每个客户机都有不同的数据模式,在保存到数据库之前,一些客户机数据需要额外的清理、重新格式化等,这就是我开始分离处理器类以处理特定客户机数据的原因之一
当前逻辑是首先从config custom部分启动所有处理器,因此,如果我们有一个新的客户端具有不同的数据,我们可以轻松创建一个新处理器,将dll抛出到bin文件夹,而无需重新启动应用程序
<Processors>
<add name="CompanyA" type="CompanyA.ThreeStepProcessor,CompanyA.Processor" outputPath="../../Output/CompanyA"/>
.....
</Processors>
.....
不,不可能。如果是,那么您可以将该接口引用传递给其他一些代码,它们可以将IGenericData
的任意实现的实例传递给CompanyAData处理器
类的Process()
方法,而它显然只希望提供CompanyAData
实例
C#支持各种通用接口,但即使使用这种语法,也只允许在另一个方向进行转换,即从IProcessor
转换到IProcessor
,而不是相反。考虑到您显示的界面,这是唯一的类型安全方向。不,这是不可能的。你所能做的就是使用sta-way接口
(IProcessor<CompanyAData>)Activator.CreateInstance(typeof(CompanyADataProcessor));
(IPProcessor)Activator.CreateInstance(typeof(companyDataProcessor));
或者使用一个方法来创建一个声明类型的实例
public T CreateInstance<T, TEntity>()
where T : IProcessor<TEntity>, new()
where TEntity : IGenericData, new()
{
return new T();
}
CreateInstance<CompanyADataProcessor, CompanyAData>();
public T CreateInstance()
其中T:IProcessor,new()
其中TEntity:IGenericData,new()
{
返回新的T();
}
CreateInstance();
彼得·杜尼霍的答案是正确的。你把方差弄错了。您的界面可以变为反变(
中的“”),方法是:
public interface IProcessor<in T> ...
公共接口IPProcessor。。。
这样做只会让你的要求发生相反的转变
语义上的原因是i处理器
是一个可以处理任何IGenericData
的处理器,而i处理器
保证只处理CompanyAData
。
由于T
显然是在上下文中的“中使用的,因此没有希望使i处理器
协变(如i处理器
)
因此(因为任何CompanyAData
都是IGenericData
):
i处理器
是i处理器
但是:
i处理器
不是i处理器
这就是对冲的意义。您的CompanyAData处理器
是CompanyAData
的一个恰当命名的处理器。它将CompanyAData
作为输入并对其进行处理。如果将其强制转换到i处理器
,那么现在将要求同一对象处理任何类型的通用数据。所以不,演员阵容是不可能的 如果你试试这个会怎么样?有什么问题吗?@CuongLe,它抛出了一个异常。i处理器
没有任何意义,因为companyadata处理器
alsready实现了接口。我想你指的是I处理器
,这正是OP要求的。所以这是可能的。@Himbrombere:谢谢……这些都是打字错误(现在已经纠正了)。正如您所说,我的意思是ipprocessor
,但我也打算从另一个接口编写转换。也就是说,某些调用方可以将CompanyAData
的一个实例传递给一个可以处理任何IGenericData
对象的实现,但不能反过来处理对象。@HimBromBeere不,OP要求强制转换到i处理器
,除非IGenericData
是协变的。@DStanley:,需要协变的是I处理器
接口,而不是IGenericData
@DStanley我只是说这是可能的(ofc.如果接口是协变的)。OP想要将一个companyDataProcessor
(它实现了IProcessor
)转换为IProcessor
,它通过协方差工作。我认为这会起作用,但是companyDataProcessor程序集存储在配置模块中,我无法在实例创建期间确定t的具体类型。