帮我理解NewExpression.Members

xan*_*ont 4 c# linq

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; }
}
Run Code Online (Sandbox Code Playgroud)

但MSDN文档中没有一个真正告诉您如何准确地初始化成员.

Mar*_*ell 6

有限的理解是你通常不需要传递会员信息; 从参数中获取(按位置)arguments参数.该会员信息旨在帮助之类的匿名类型,它打交道时,一些内部的API(我怀疑)(在C#),如它们被成员初始化(像一个对象的初始化),但它实际上是由构造函数初始化.这意味着像LINQ-to-SQL这样的东西会看到一个constcutor使用,然后(在查询的下一部分)访问obj.Name- 它需要一种方法来理解这意味着"构造函数的第三个参数(从未实际获得)特别是对于像分组这样的事情.

所以这很好:

        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");
Run Code Online (Sandbox Code Playgroud)

如果你确实需要它们,我希望它们相对于"arguments"表达式是位置的 - 所以你要传入(在数组中)id和name的成员.请注意,intialzer样式绑定还有一个单独的表达式.