帮我理解NewExpression.Members

时间:2010-10-17 04:20:42

标签: 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; }
}

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

1 个答案:

答案 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样式绑定的单独的表达式。