如何从动态加载的Type创建Generic对象?

时间:2009-09-23 07:35:01

标签: c# generics reflection

我正在使用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对象(实际上是SubSonic Active Record Object)。

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

我该如何做到这一点?

2 个答案:

答案 0 :(得分:3)

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

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

你想对record做什么?如果真正的目标是创建ActiveRecord<T>对象,但您不需要知道任何其他操作的T,那么您需要使用Type.MakeGenericTypeMethodInfo.MakeGenericMethod取决于在ActiveRecord API(我不熟悉)...但是你不能在代码行中以静态类型的方式(取决于T)使用结果跟随。

ActiveRecord<T>是否实现了非通用接口?如果是这样,那就是构建相关实例后通常使用的内容。

如果您可以提供指向ActiveRecord<T>文档的链接以显示如何构建实例,我很乐意为您编写反射代码...

答案 1 :(得分:0)

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

你正在尝试将一个类型转换为另一个接收fomer的对象:

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