NewExpression.Members是否告知LINQ运行时如何将类型的构造函数参数映射到其属性?如果是这样,是否有一个属性来设置映射?我想象的是这样的事情:
public class Customer
{
public Customer(int id, string name)
{
Id = id;
Name = name;
}
[CtorParam("id")]
public int Id { get; set; }
[CtorParam("name")]
public string Name { get; set; }
}
但MSDN文档中没有一个真正告诉您如何准确地初始化成员。
答案 0 :(得分:6)
我的有限的理解是您通常不需要传递会员信息;参数是从arguments
参数(按位置)获取的。 成员信息是(我怀疑)在处理匿名类型之类的东西时帮助一些内部API,其中看起来(在C#中)就像它们被成员初始化一样(像对象初始化器一样,但实际上是由构造函数初始化的。这意味着像LINQ-to-SQL这样的东西会看到 constcutor 使用,然后(在查询的下一部分中)访问obj.Name
- 它需要一种方法来理解这意味着“构造函数的第3个参数(实际上从未被调用过)。特别是对于像分组这样的事情。
所以这很好:
var param = Expression.Parameter(typeof(string), "name");
var body = Expression.New(typeof(Customer).GetConstructor(new[] {typeof(int), typeof(string)}),
Expression.Constant(1), param);
var func = Expression.Lambda<Func<string, Customer>>(body, param).Compile();
var cust = func("abc");
如果你做需要它们,我希望它们相对于“arguments”表达式是位置的 - 所以你要传入(在数组中)id和name的成员。请注意,还有一个用于intialzer样式绑定的单独的表达式。