LINQ: Как принудительно использовать ссылку на основе значения?

Я хочу предоставить пользователю набор фильтров для выбора, и каждый фильтр будет соответствовать 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 по-прежнему смотрит на какой-то анонимный тип, даже если я использую локальную переменную, объявленную для строки. Есть ли способ заставить эту работу работать так, как я хочу?

6
задан Steven 30 November 2010 в 22:36
поделиться