我可以在编译时声明Type <t>的变​​量而不指定T吗?</t>

时间:2010-01-19 16:32:47

标签: .net generics assemblies

  

可能重复:
  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();

如何加载???

2 个答案:

答案 0 :(得分:2)

如果您在通用方法或类型中,则只能这样做,以便您可以使用泛型类型。在即时时间(即使它是运行时),必须知道确切的类型,因为.NET不像Java那样使用擦除。

但是,您可以通过MakeGenericType创建任何类型的实例(如果您使用Activator也是通用的),并将其分配给object类型的变量。

要获得要激活的类型,您可以获得如下具体类型:

typeof(IMyContentInterface<>).MakeGenericType(typeToUse)

答案 1 :(得分:2)

为了调用MyMethod,您可能必须将其作为非泛型接口或类的一部分包含在内,或者使用对您获取的对象的反射来调用它(因此可以在运行时获取T的类型)< / p>