如何使用lambda表达式创建匿名类型?

Soe*_*Soe 2 c# lambda entity-framework entity-framework-4.1

有人可以告诉我如何使用lambda表达式创建以下匿名类型吗?

p => new { p.Property1, p.Property2}
Run Code Online (Sandbox Code Playgroud)

我真的坚持这个,没有找到解决方案的地方.我已经尝试了很多方法,但仍然无法动态生成上述表达式.我的意图是使用它来将唯一键映射到我的POCO.任何帮助都会真正有用.

Jon*_*Jon 5

这就是你追求的吗?

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);
Run Code Online (Sandbox Code Playgroud)

如果是这样,特别是因为你在谈论实体,我会建议你:

  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);
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码仍然存在问题:Property1并且Property2可以公开设置,这意味着在将Foo实例放入映射Property1后,如果稍后修改了它们的键可能与它们的值不匹配.然而,这是一个在实践中经常发生的问题,除了"只是不要弄乱对象属性"之外,我所知道的确实没有好的解决方案.