Как создать анонимный тип с помощью лямбда-выражения? - PullRequest
2 голосов
/ 12 сентября 2011

Может кто-нибудь показать мне, как создать следующий анонимный тип с лямбда-выражением?

p => new { p.Property1, p.Property2}

Я действительно застрял в этом и не знаю, где найти решение. Я пробовал так много способов, но все еще не могу динамически создавать вышеприведенное выражение. Я намерен использовать это для сопоставления уникальных ключей с моими POCO. Любая помощь будет действительно ценить.

Ответы [ 2 ]

5 голосов
/ 12 сентября 2011

Это то, что вам нужно?

class Foo {
    public string Property1 { get; set; }
    public string Property2 { get; set; }
}

Func<Foo, object> lambda = foo => new { foo.Property1, foo.Property 2 };

var foo = new Foo { Property1 = "foo", Property2 = "bar" };
var anon = lambda(foo);

Если это так, особенно если вы говорите о сущностях, я бы предложил вам:

  1. Использовать Tuple вместо анонимных типов.Кортежи также являются неизменяемыми, что является плюсом, если вы хотите использовать их в качестве ключей словаря.
  2. Интегрируйте функцию создания уникального ключа в свой класс сущностей, а не раскручивайте ее во внешнюю функцию (анонимную или нет).Ваша сущность должна знать, какие из ее свойств составляют уникальный ключ, а не какой-то внешний код.

Например:

class Foo {
    public string Property1 { get; set; }
    public string Property2 { get; set; }

    public object GetUniqueKey()
    {
        return Tuple.Create(this.Property1, this.Property2);
    }
}

Все еще существует проблема с кодом выше: Property1 и Property2 являются общедоступными, что означает, что после помещения Foo экземпляров в карту их ключи могут не совпадать со своими значениями, если, например, Property1 будет позже изменен.Однако это проблема, которая встречается довольно часто на практике, и я не знаю хорошего решения, кроме как «просто не связывайтесь со свойствами объекта».

0 голосов
/ 24 августа 2016
    Func<object> ano1 = () => new { Property1 = 1, Property2 = 2 };
    Expression<Func<object>> ano2 = () => new { Property1 = 1, Property2 = 2 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...