我简化了代码,但基本上这个代码在循环上运行,类型来自反射。这里唯一的常量是IWorker<T>
接口。
我需要访问IWorker
的属性,但我无法强制转换它,因为编译器不接受argType
,任何想法?
(我可以用动态做到这一点,但我希望有一个替代方案来防止因重构而导致的未来错误)
Type argType = @interface.GetGenericArguments().First();
var worker = (IWorker<argType>)FormatterServices.GetUninitializedObject(MyType);
MyType
派生自IWorker<T>
,其中T
在编译时未知。
答案 0 :(得分:2)
如果可能的话,你应该使方法通用。这是保持编译时类型安全的唯一方法。如果这不是一个选项,并且此方法必须直接接受Type
参数,那么根据定义,您最终使用的任何解决方案都将无法维护静态类型。
public static IWorker<T> Foo<T>()
{
return (IWorker<T>)FormatterServices.GetUninitializedObject(typeof(T));
}
然后您可以将其称为:
IWorker<ArgType> worker = Foo<ArgType>();
答案 1 :(得分:1)
我担心你不能这样做。必须在编译时知道泛型类型参数。类型转换也必须在编译时知道。有两种选择:
使用通用方法(请参阅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";