在 C# 中创建动态

本文关键字:动态 创建 | 更新日期: 2023-09-27 18:32:08

我需要使用接口创建动态T。但是我收到"类型转换"错误。这是我的代码:

interface IEditor { }
class Editor : IEditor { }
class Test<T> { }

现在将是动态的,所以我在下面使用这段代码:

Test<IEditor> lstTest = (Test<IEditor>)Activator.CreateInstance(typeof(Test<>).MakeGenericType(typeof(Editor)));

我收到以下错误

无法将类型为"CSharp_T.Test'1[CSharp_T.Editor]"的对象转换为类型"CSharp_T.Test'1[CSharp_T.IEditor]"。

此错误不是编译错误,但我收到运行时错误。

在 C# 中创建动态 <T>

泛型类不支持协方差,但接口支持协方差。如果定义接口ITest<>并将T标记为out参数,如下所示,

interface IEditor { }
class Editor : IEditor { }
interface ITest<out T> { }
class Test<T> : ITest<T> { }

您将能够执行此操作:

ITest<IEditor> lstTest = (ITest<IEditor>)Activator
    .CreateInstance(typeof(Test<>)
    .MakeGenericType(typeof(Editor)));

但是,这将限制在ITest<>及其实现中使用 T 参数的方式。

在 ideone 上演示。

Test不是协变的(它在泛型参数中是不变的)。 因此,Test<IEditor>不是Test<IEditor>的子类型。 这两种类型之间没有关系。

您可以首先创建一个类型为 Test<IEditor> 的对象,而不是 Test<IEditor> ,然后强制转换可以成功。