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/