我需要使用界面创建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

08-06 06:20