c# - 帮助我了解 NewExpression.Members

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

最佳答案

我的有限理解是您通常不需要传递成员(member)信息;参数取自(按位置)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");

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

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

相关文章:

c# - 在 C# Datagridview 中以编程方式在指定位置添加新列

javascript - Bootstrap 4 使用 JSON 进行模态验证

.net - 将两个 LINQ 查询合并为一个

c# - 获取列表列表中的最大值列表

c# - 动态 LINQ(到对象): Substituting a object name in a query from a list of object names (string)?

javascript - JavaScript 是否具有与 LINQ 的 Select 语句类似的功能?

C# 控制台应用程序代码在等待后不执行

c# - unity EditorGUI.PropertyField 无法完全禁用数组或列表

c# - 关于 linq select 和 ToList() 的问题

c# - Expression<Func<T,bool>> 在泛型方法中创建时添加不需要的 Convert