【发布时间】:2011-04-14 00:32:01
【问题描述】:
在 C# 3.0 中,您可以使用 Expression 创建具有以下语法的类:
var exp = Expression.New(typeof(MyClass));
var lambda = LambdaExpression.Lambda(exp);
object myObj = lambda.Compile().DynamicInvoke();
但是如何使用 Expression 来创建 Anonymous 类?
//anonymousType = typeof(new{ Name="abc", Num=123});
Type anonymousType = Expression.NewAnonymousType??? <--How to do ?
var exp = Expression.New(anonymousType);
var lambda = LambdaExpression.Lambda(exp);
object myObj = lambda.Compile().DynamicInvoke();
【问题讨论】:
-
@Flash,这是不可能的,至少不是直接的。当您创建匿名类型时,编译器为您做了很多“魔术”——它是实际声明具有一堆属性的真正 C# 类的语法糖。编译器只是为你做这一切。没有表达式树类型可以自动为您完成所有这些工作。如果您查看我引用的链接,它提供了一种解决方法。但是,它使用了 Reflection.Emit,它不适合虚心。
-
Kirk:OP 想要构建一个匿名类,而不是从头开始创建一个。只要他在编译时知道属性的名称和类型是什么,他就可以让编译器为他创建类型,他所要做的就是弄清楚如何实例化它。
-
@Gabe,我不同意你对 OP 想要什么的解释,但我想我们会看到的。 ;)
-
@Gabe,我不同意。他注释掉了他对类的定义,大概是为了找到一种用表达式树来做到这一点的方法。此外,这篇文章的标题是“如何使用表达式构建匿名类型?”我从来没有用动词“构建”来指代“实例化”。
标签: c# linq expression-trees anonymous-types