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

本文关键字:类型 创建 表达式 何使用 lambda | 更新日期: 2023-09-27 18:08:24

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

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

我真的被这个卡住了,找不到解决办法。我尝试了很多方法,但仍然不能动态地产生上述表达式。我的意图是使用它将唯一键映射到poco。

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

这是你想要的吗?

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);
    }
}

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

    Func<object> ano1 = () => new { Property1 = 1, Property2 = 2 };
    Expression<Func<object>> ano2 = () => new { Property1 = 1, Property2 = 2 };