Я хочу предоставить пользователю набор фильтров для выбора, и каждый фильтр будет соответствовать Expression
. Итак, я могу взять динамический список доступных элементов («Джо», «Стив», «Пит» и т. Д.) И создать набор «жестко заданных» фильтров на основе по этим именам, и пусть пользователь выбирает, какой фильтр (ы) он хочет использовать. Моя проблема в том, что даже когда я пытаюсь «жестко закодировать» свое выражение на основе строкового значения из динамического списка, выражение по-прежнему сохраняет значение как, как мне кажется, свойство, свисающее с анонимного типа (и Я не знаю, как сериализовать анонимный тип). Извините, если это сбивает с толку, я не совсем уверен, как это сформулировать.
Вот мой пример кода:
public class Foo
{
public string Name { get; set; }
}
static void Main(string[] args)
{
Foo[] source = new Foo[]
{
new Foo() { Name = "Steven" } ,
new Foo() { Name = "John" } ,
new Foo() { Name = "Pete" },
};
List<Expression<Func<Foo, bool>>> filterLst = new List<Expression<Func<Foo, bool>>>();
foreach (Foo f in source)
{
Expression<Func<Foo, bool>> exp = x => x.Name == f.Name;
filterLst.Add(exp);
}
}
}
Моя проблема в том, что когда я смотрю, когда я смотрю на тело своего выражения, оно читается следующим образом:
(x.Name = value(ConsoleApplication1.Program+<>c__DisplayClass3).value)
Когда я действительно хочу, чтобы первое выражение читалось как это:
(x.Name = "Steven")
(вместо этого, если я изменю свой код на этот, то получу именно то, что я получу:
Expression<Func<Foo, bool>> exp = x => x.Name == "Steven";
)
Я пробовал принудительно преобразовать свое значение в локальное строковое значение, прежде чем вставлять его в выражение, но оно похоже, не помогает:
List<Expression<Func<Foo, bool>>> filterLst = new List<Expression<Func<Foo, bool>>>();
foreach (Foo f in source)
{
string value = f.Name;
Expression<Func<Foo, bool>> exp = x => x.Name == value;
filterLst.Add(exp);
}
Я не понимаю, почему (или даже как) это ' s по-прежнему смотрит на какой-то анонимный тип, даже если я использую локальную переменную, объявленную для строки. Есть ли способ заставить эту работу работать так, как я хочу?