【问题标题】:Can I declare a variable of Type<T> without specifying T at compile time? [duplicate]我可以在编译时声明一个 Type<T> 变量而不指定 T 吗? [复制]
【发布时间】:2010-01-20 00:43:18
【问题描述】:

可能重复:
Can I declare a variable of Type<T> without specifying T at compile time?

目标:动态加载“MyContent”类。我有 1 个接口&lt;T&gt;,1 个抽象泛型class&lt;T&gt;

代码:

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();

如何加载???

【问题讨论】:

标签: .net generics assemblies


【解决方案1】:

为了调用 MyMethod,您要么必须将其作为非泛型接口或类的一部分包含在内,要么在返回的对象上使用反射调用它(因此可以在运行时获取 T 的类型)

【讨论】:

    【解决方案2】:

    只有在泛型方法或类型中才能这样做,以便可以使用泛型类型。在实例化时(即使是运行时),必须知道确切的类型,因为 .NET 不像 Java 那样使用擦除。

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

    要激活类型,您可以像这样获取具体类型:

    typeof(IMyContentInterface<>).MakeGenericType(typeToUse)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-18
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多