Это то, что вам нужно?
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);
Если это так, особенно если вы говорите о сущностях, я бы предложил вам:
- Использовать
Tuple
вместо анонимных типов.Кортежи также являются неизменяемыми, что является плюсом, если вы хотите использовать их в качестве ключей словаря. - Интегрируйте функцию создания уникального ключа в свой класс сущностей, а не раскручивайте ее во внешнюю функцию (анонимную или нет).Ваша сущность должна знать, какие из ее свойств составляют уникальный ключ, а не какой-то внешний код.
Например:
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
будет позже изменен.Однако это проблема, которая встречается довольно часто на практике, и я не знаю хорошего решения, кроме как «просто не связывайтесь со свойствами объекта».