У меня ограничено понимание заключается в том, что вам обычно не требуется передавать информацию о членах; аргументы берутся (по положению) из параметра 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.
Я надеялся, что есть способ объявить сопоставление. Я спрашиваю, потому что DbLinq пытается перебрать члены, когда встречается с новым оператором, но он всегда равен нулю. Ну, я все-таки нашел работу. Спасибо за помощь. http://code.google.com/p/dblinq2007/source/browse/trunk/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionDispatcher.Analyzer.cs – xanadont