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的具体类型。