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 文档真正告诉您成员是如何初始化的。

最佳答案

我有限的理解是你通常不需要传递成员(member)信息;参数是从 arguments 参数(按位置)获取的。成员信息(我怀疑)旨在在处理诸如匿名类型之类的事情时帮助一些内部 API,这些内容(在 C# 中)看起来像是由成员初始化(如对象初始化程序),但实际上是由构造函数初始化的.这意味着像 LINQ-to-SQL 这样的东西会看到一个构造函数的使用,然后(在查询的下一部分)访问 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");

如果您确实需要它们,我希望它们是相对于“参数”表达式的位置 - 因此您将(在数组中)传入 id 和 name 的成员。请注意,还有一个用于初始化器样式绑定(bind)的单独表达式。

关于c# - 帮助我了解 NewExpression.Members,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3952030/

10-13 08:09