可能重复:
Can I declare a variable of Type<T> without specifying T at compile time?
目标:动态加载“MyContent”类。我有1个接口<T>
,1个抽象通用class<T>
。
代码:
public interface IMyObjectInterface{
}
public abstract MyAbstractObject : IMyObjectInterface{
}
public class MyObject : MyAbstractObject{
}
public interface IMyContentInterface<T> where T : MyAbstractObject
{
T MyMethod();
void MyMethod2(T);
}
public abstract MyAbstractContent<T>, IMyContentInterface<T> where T : MyAbstractObject
{
public abstract T MyMethod();
public abstract void MyMethod2(T);
}
public class MyContent : MyAbstractContent<MyObject>
{
public override MyObject MyMethod() { //do something with MyObject }
public override void MyMethod2(MyObject) { //do something with MyObject }
}
现在,我们加载:
IMyObjectInterface obj = (IMyObjectInterface)Assembly.Load("MyAssembly").CreateInstance("MyObject");
IMyContentInterface<???> content = (IMyContentInterface<???>)Assembly.Load("MyAssembly").CreateInstance("MyContent");
content.MyMethod();
如何加载???
答案 0 :(得分:2)
如果您在通用方法或类型中,则只能这样做,以便您可以使用泛型类型。在即时时间(即使它是运行时),必须知道确切的类型,因为.NET不像Java那样使用擦除。
但是,您可以通过MakeGenericType
创建任何类型的实例(如果您使用Activator
也是通用的),并将其分配给object
类型的变量。
要获得要激活的类型,您可以获得如下具体类型:
typeof(IMyContentInterface<>).MakeGenericType(typeToUse)
答案 1 :(得分:2)
为了调用MyMethod,您可能必须将其作为非泛型接口或类的一部分包含在内,或者使用对您获取的对象的反射来调用它(因此可以在运行时获取T的类型)< / p>