我已经简化了代码,但是基本上该代码在循环上运行,类型来自反射。这里唯一的常量是IWorker<T>接口。

我需要访问IWorker的属性,但是由于argType不被编译器接受,所以我无法进行强制转换,有什么想法吗?

(我可以通过动态方式做到这一点,但我希望能找到一种替代方法,以防止由于重构而导致将来的错误)

Type argType = @interface.GetGenericArguments().First();

var worker = (IWorker<argType>)FormatterServices.GetUninitializedObject(MyType);


MyTypeIWorker<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";

09-28 06:23