gpt4 book ai didi

c# - 帮助我了解 NewExpression.Members

转载 作者:太空狗 更新时间:2023-10-30 00:57:58 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com