代码之家  ›  专栏  ›  技术社区  ›  TheVillageIdiot

如何从动态加载类型创建通用对象?

  •  1
  • TheVillageIdiot  · 技术社区  · 15 年前

    我得到了 Type 使用 Assembly 分类如下:

    var asm = Assembly.GetAssembly(typeof(MyAssembly));
    var t=asm.GetType("FULLY QUALIFIED CLASS NAME", true, true);
    

    然后我用这种类型创建对象:

    var obj = Activator.CreateObject(t, new []{ params });
    

    现在我要将此对象转换或强制转换为 Generic 对象(实际上是亚音速活动记录对象)。

    var record = (ActiveRecord<PUT SOMEHOW TYPE t HERE>)obj;
    

    我怎样才能做到这一点?

    2 回复  |  直到 15 年前
        1
  •  3
  •   Jon Skeet    15 年前

    要点 静止的 输入就是在编译时知道类型。

    你希望什么类型的 record 变量是什么?编译器需要知道-它不能等到执行时间。

    你想怎么办 记录 反正?如果真正的目标是创造一个 ActiveRecord<T> 对象,但对于任何其他操作,您不需要知道T,然后需要使用反射 Type.MakeGenericType MethodInfo.MakeGenericMethod 取决于 ActiveRecord API(我不熟悉)但是您将无法在下面的代码行中以静态类型(取决于t)的方式使用结果。

    活动记录<t> 实现非能量接口?如果是这样,那么在构造相关实例之后通常会使用这个方法。

    如果你能提供一个链接 活动记录<t> 为了演示如何构造实例,我很乐意为您编写反射代码…

        2
  •  0
  •   kljiy    15 年前

    类必须继承ActiveRecord或本身是ActiveRecord。

    您试图将一个类型强制转换为另一个接收可变fomer的对象:

    Cat c = new Cat();
    List<Cat> l = (List<Cat>) c; // error.