我已经简化了代码,但是基本上该代码在循环上运行,类型来自反射。这里唯一的常量是IWorker<T>
接口。
我需要访问IWorker
的属性,但是由于argType
不被编译器接受,所以我无法进行强制转换,有什么想法吗?
(我可以通过动态方式做到这一点,但我希望能找到一种替代方法,以防止由于重构而导致将来的错误)
Type argType = @interface.GetGenericArguments().First();
var worker = (IWorker<argType>)FormatterServices.GetUninitializedObject(MyType);
MyType
从IWorker<T>
派生,其中T
在编译时未知。 最佳答案
恐怕你做不到。泛型类型参数必须在编译时已知。类型转换也必须在编译时知道。有两种选择:
使用通用方法(请参见Servy's answer)。
创建一个非通用接口,并使IWorker<T>
从其继承:
public interface IWorker
{
string MyProperty { get; }
}
public interface IWorker<T> : IWorker
{
...
}
然后,您可以像这样使用它:
var worker = (IWorker)FormatterServices.GetUninitializedObject(MyType);
worker.MyProperty = "Somwthing";