在C# 3.0中,你可以使用表达式来创建一个具有以下语法的类:
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();
型
4条答案
按热度按时间yyhrrdl81#
你已经接近了,但是你必须注意匿名类型没有默认的构造函数。下面的代码打印
{ Name = def, Num = 456 }
:字符串
如果你不需要创建很多这种类型的示例,
Activator.CreateInstance
也可以(它对少数示例来说更快,但对很多示例来说更慢)。下面的代码打印{ Name = ghi, Num = 789 }
:型
cczfrluj2#
由于匿名类型没有默认的空构造函数,所以不能使用
Expression.New(Type)
重载.和ConstructorInfo
,然后将参数传递给Expression.New
方法。就像这样:
字符串
6gpjuf903#
你可以避免使用
DynamicInvoke
,它非常慢。你可以使用C#中的类型推断来获得匿名类型的泛型示例化。比如:字符串
现在你可以打电话了,
型
你可以使用
AnonymousInstantiator
方法来生成函数来示例化任何匿名类型,并带有任意数量的属性,只是你必须首先传递一个适当的示例。输入参数必须作为对象数组传递。如果你担心装箱性能,那么你必须编写一个自定义示例化器,它只接受string
和int
作为输入参数,但是这种示例化器的使用将受到更多的限制。zqdjd7g94#
使用动态类型创建:
字符串