c# - 如何使用 Expression 构建匿名类型?

标签 c# linq expression-trees anonymous-types

在 C# 3.0 中,您可以使用 Expression 创建具有以下语法的类:

var exp = Expression.New(typeof(MyClass));
var lambda = LambdaExpression.Lambda(exp);
object myObj = lambda.Compile().DynamicInvoke();

但是如何使用 Expression 创建匿名类呢?

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

最佳答案

你很接近,但你必须知道匿名类型没有默认构造函数。以下代码打印 { Name = def, Num = 456 }:

Type anonType = new { Name = "abc", Num = 123 }.GetType();
var exp = Expression.New(
            anonType.GetConstructor(new[] { typeof(string), typeof(int) }),
            Expression.Constant("def"),
            Expression.Constant(456));
var lambda = LambdaExpression.Lambda(exp);
object myObj = lambda.Compile().DynamicInvoke();
Console.WriteLine(myObj);

如果您不必创建许多这种类型的实例,Activator.CreateInstance 也可以(它对一些实例更快,但对许多实例更慢)。此代码打印 { Name = ghi, Num = 789 }:

Type anonType = new { Name = "abc", Num = 123 }.GetType();
object myObj = Activator.CreateInstance(anonType, "ghi", 789);
Console.WriteLine(myObj);

关于c# - 如何使用 Expression 构建匿名类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3740532/

相关文章:

c# - C# 中的 C++ "system()"

c# - 条件语句检查空

c# - 带有 RazorEngine 的 Linq 命名空间

c# - 按列表中的子属性排序

.net - 为什么从表达式动态生成的委托(delegate)比硬编码的 lambda 慢?

c# - Sprache 中的文本查询解析

c# - 从方法体内获取表达式树

C# 泛型与 C++ 模板的比较

c# - 将 C# 中的字符串与 if 语句中的 OR 进行比较

c# - LINQ:如何测试值是否包含在集合中