我需要使用界面创建DynamicT。但是我收到“类型转换”错误。
这是我的代码:
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)));
但是,这将限制在
T
及其实现中使用ITest<>
参数的方式。Demo on ideone。