如何使用表达式构建匿名类型? [英] How to use Expression to build an Anonymous Type?
问题描述
在C#3.0中,您可以使用Expression使用以下语法创建一个类:
In C# 3.0 you can use Expression to create a class with the following syntax:
var exp = Expression.New(typeof(MyClass));
var lambda = LambdaExpression.Lambda(exp);
object myObj = lambda.Compile().DynamicInvoke();
但是您如何使用Expression创建一个匿名类呢?
But how do you use Expression to create an Anonymous class?
//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 }
:
You're close, but you have to be aware that anonymous types don't have default constructors. The following code prints { 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 = g Num = 789 }
:
If you don't have to create many instances of this type, Activator.CreateInstance
will do just as well (it's faster for a few instances, but slower for many). This code prints { Name = g Num = 789 }
:
Type anonType = new { Name = "abc", Num = 123 }.GetType();
object myObj = Activator.CreateInstance(anonType, "ghi", 789);
Console.WriteLine(myObj);
这篇关于如何使用表达式构建匿名类型?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!