2010-10-17 83 views
4

是否NewExpression.Members通知LINQ运行时如何为类型的构造函数的参数映射到其属性?如果是这样,是否有一个属性来设置映射?我在想像这样的事情:帮助我理解NewExpression.Members

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文档能真正告诉您成员的初始化程度。

回答

5

有限的理解是,你通常不会需要通过会员信息;参数从arguments参数中获得(按位置)。该成员信息为目的(我怀疑),以帮助之类的匿名类型,(在C#),如它们被成员初始化(像一个对象的初始化)打交道时,一些内部的API,但不存在实际上由构造函数初始化。这意味着这样的LINQ到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的成员。注意,还有一个单独的用于intialzer风格绑定的表达式为

+0

我希望有一些方式来声明的映射。我在问,因为DbLinq在遇到新操作符时尝试循环成员,但它始终为空。哦,我无论如何找到了解决方法。谢谢您的帮助。 http://code.google.com/p/dblinq2007/source/browse/trunk/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionDispatcher.Analyzer.cs – xanadont 2010-10-18 03:28:07