2010-10-17 5 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. Член является (я подозреваю), чтобы помочь некоторым внутренним 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"); 

Если вы сделать нужно, я бы ожидать, что они будут позиционными относительно «аргументы» выражения - поэтому вы должны передать (в массиве) член для идентификатора и имени. Обратите внимание, что есть также выражение для привязки стиля intialzer.

+0

Я надеялся, что есть способ объявить сопоставление. Я спрашиваю, потому что DbLinq пытается перебрать члены, когда встречается с новым оператором, но он всегда равен нулю. Ну, я все-таки нашел работу. Спасибо за помощь. http://code.google.com/p/dblinq2007/source/browse/trunk/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionDispatcher.Analyzer.cs – xanadont

Смежные вопросы