2

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

我需要访问的属性,IWorker但我不能转换它,因为argType编译器不接受,有什么想法吗?

(我可以用动态来做到这一点,但我希望有一个替代方案来防止未来由于重构而出现错误)

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

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

MyType源自编译时未知的位置IWorker<T>T

4

2 回答 2

2

如果可能的话,您应该使该方法具有通用性。这是维护编译时类型安全的唯一方法。如果这不是一个选项,并且此方法必须Type直接接受参数,那么根据定义,您最终使用的任何解决方案都将无法维持静态类型。

public static IWorker<T> Foo<T>()
{
    return (IWorker<T>)FormatterServices.GetUninitializedObject(typeof(T));
}

然后你可以这样称呼它:

IWorker<ArgType> worker = Foo<ArgType>();
于 2013-06-12T18:25:33.667 回答
1

恐怕你做不到。泛型类型参数必须在编译时已知。类型转换也必须在编译时知道。几乎有两种选择:

  1. 使用通用方法(参见Servy 的回答)。

  2. 创建一个非通用接口并从中IWorker<T>继承:

    public interface IWorker 
    { 
        string MyProperty { get; }
    }
    
    public interface IWorker<T> : IWorker
    {
        ...
    }
    

    然后你可以像这样使用它:

    var worker = (IWorker)FormatterServices.GetUninitializedObject(MyType);
    worker.MyProperty = "Somwthing";
    
于 2013-06-12T18:29:33.407 回答