在 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]"。
此错误不是编译错误,但我收到运行时错误。
泛型类不支持协方差,但接口支持协方差。如果定义接口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>
,然后强制转换可以成功。