gpt4 book ai didi

C# 选择具有名称的属性

转载 作者:行者123 更新时间:2023-11-30 21:27:41 24 4
gpt4 key购买 nike

我不确定如何正确表达这个问题,所以在一开始就表示歉意。

我正在使用 MongoDb,在某些时候,我需要设计一个 lambda 表达式,如下所示:

...Set(g => g.Profile.First_Name, "Test");

现在,g 指的是一个名为 User 的类,它有一个 Profile 类型的属性(一个不同的类),具有相同的名称个人资料。如您所见,在 lambda 表达式中,我选择了 First_Name 属性,然后将值 "Test" 传递给它。

我的问题:有没有办法按名称选择属性?

更详细一点——这样的事情可能吗? :

 .... g.Profile. ("First_Name")

当我输入这个时,即使对我来说这听起来很荒谬,但我需要动态选择特定的属性,因此我需要通过它们的名称来选择它们。

我如何才能真正做到这一点?

我试过了:

g.Profile.GetType().GetProperty("First_Name")

但它似乎并不等同于g.Profile.First_Name

关于可以做什么的任何想法?

最佳答案

我可能实际上不想在这里使用反射。

g => ... 实际上不是一个 lambda 函数,而是一个 expression tree — 它是一些用于描述过程的奇特语法糖,在本例中,是一个在给定 User 类型记录的情况下获取特定属性的过程。 MongoDB API 提供允许表达式的重载,因此您可以更优雅地编写 90% 的操作代码,但如果您确实需要动态,您当然可以绕过它,例如:

var setName = Builders<User>.Update.Set(g => g.Profile.First_Name, "Test");

大致相当于:

var setName = Builders<User>.Update.Set("profile.first_name", "Test");

当然,如果您的属性、自定义约定等具有 BsonProperty 属性,则可以更改正在更新的 BSON 的路径。

现在,假设您不想硬编码 BSON 路径。好吧,您可以生成动态表达式树,但它不是很优雅或性能不佳。你会使用类似这样的东西:

ParameterExpression param = Expression.Parameter(typeof(User), "g");
Expression<Func<User, String>> expr =
Expression.Lambda<Func<User, String>>(
Expression.Property(
Expression.Property(
param,
"Profile"
),
"First_Name"
),
new[] { param }
);

var setName = Builders<User>.Update.Set(expr, "Test");

关于C# 选择具有名称的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57383920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com