2010-04-27 92 views
3

因此,我一直在努力研究这一整个上午,并没有运气。我试图找到一种方法来动态地创建一个方法/委托/ lambda,它返回某个基类的特定类的新实例(直到运行时才知道)。动态创建方法

我可以保证关于未知/动态类

  1. 它将总是从一个已知的类(行)
  2. 它将具有至少2层构造(一个接受一个长期的,和一个接受继承以下一个IDataRecord)

我打算doign如下:

  1. 找到所有的C这对他们
  2. 特定属性创建lasses委托/方法/λ/不管是创建类
  3. 的新实例存储委托/无论在一个结构/类的一些属性一起
  4. 插入结构化为散列表
  5. 需要时,将信息从哈希表中拉出并调用委托/无论如何获得该类的新实例并将其返回/添加到列表/等。

我只需要#2以上的帮助!我不知道从哪里开始。我真的只需要一些参考资料来让我开始,或者一些关键词投入到谷歌。

这是一个小巧/易于使用的ORM在我们这里的办公室。我明白上述并不简单,但一旦工作,应该使维护代码变得非常简单。

如果您需要更多信息,请让我知道!并提前致谢! :)

回答

4

您可以使用LINQ表达式构建拉姆达(long p) => new XXX(p) as Row在运行时:

Type type = // ... 
ConstructorInfo ctor = type.GetConstructor(new Type[] { typeof(long) }); 

var p = Expression.Parameter(typeof(long), "p"); 
var expr = Expression.Lambda<Func<long, Row>>(
       Expression.TypeAs(
        Expression.New(ctor, p), 
        typeof(Row)), 
       p); 

Func<long, Row> rowCreator = expr.Compile(); 

Row row = rowCreator(10); 
+1

从来没有真正看到表达的良好用法,但你睁开了我的眼睛:) – Stormenet 2010-04-27 18:06:32

+0

我喜欢的风格,但它编译为真正的IL和表现良好的新的长(); – Andrey 2010-04-27 18:12:08

+0

@Andrey:'expr.Compile()'将表达式编译成真正的IL。性能与编译时编译lambda表达式时相同,所以它的性能如下:-) – dtb 2010-04-27 18:14:35

3

Activator.CreateInstance

样本:

string typeName = ...; 
Activator.CreateInstance(Type.GetType(typeName), params); 
+0

我相信这是的CreateInstance的过载,让你指定构造函数参数。这将是你最好的选择。 – Tejs 2010-04-27 17:41:15

+0

这样可以很好地工作,除非他必须每秒处理数千次,在这种情况下,编译好的代表会更好。 – Gabe 2010-04-27 17:43:13

+0

我正在寻找一个编译的委托: - \这将在一个网站上运行,并且如果可能的话,我希望在加载时发生任何性能下降。 – TJMonk15 2010-04-27 17:48:22