Мне нужно сгенерировать дерево выражений, чем проверять два объекта (аргументы) для равенства. Я знаю, что эти объекты будут иметь свойства, поэтому мне нужно сравнить их значения, как это сделать? Итак, у меня есть что-то вроде obj1
, obj2
и массив строк с именами свойств, которые мне нужно проверить. Вот как я вижу это:Деревья выражений, сопоставление объектов
var leftObject = E.Parameter(typeof (object), "leftObject");
var rightObject = E.Parameter(typeof (object), "rightObject");
var properties = E.Parameter(typeof (string[]), "properties");
var i = E.Parameter(typeof(int), "i");
var equal = E.Parameter(typeof (bool), "equal");
var body = E.Block
(
new[] { properties, i},
E.Assign(properties,E.Constant(props)),
E.Assign(i,E.Constant(0)),
E.Assign(equal,E.Constant(true)),
E.Loop
(
E.Property(leftObject,props[i]) == E.Property(rightObject,props[i])
)
);
Как осуществить доступ к свойствам один за другим в цикле?
P.S. E
- мой псевдоним для Expression
.
Спасибо.Я уже сделал это с помощью отражения, но это очень медленно, поэтому я решил сгенерировать методы сравнения для разных объектов и сохранить их скомпилированные в памяти, чем проверить, существует ли метод сравнения для заданного типа и просто позвоните. Это в сто раз быстрее, чем отражение, потому что выражение скомпилировано один раз для каждого типа, который мне нужно сравнить. – 2010-12-07 19:33:18