繁体   English   中英

C#选择具有名称的属性

[英]C# Select property with name

我不确定如何正确表达这个问题,因此一开始就道歉。

我正在使用MongoDb,有时需要设计如下的lambda表达式:

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

现在, g引用了一个名为User的类,该类具有Profile类型的属性(另一个类),并且具有相同的Profile名称。 如您所见,在lambda表达式中,我选择了First_Name属性,然后将值"Test"传递给它。

我的问题:是否可以通过名称选择属性?

更详细地讲-这样可能吗?

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

在键入此内容时,即使对我来说也听起来很荒谬,但是我需要动态选择特定的属性,因此需要通过它们的名称来选择它们。

我实际上如何实现这一目标?

我试过了 :

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

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

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

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

g => ...实际上不是lambda函数,而是表达式树 —它是描述过程的一种奇特的语法糖,在这种情况下,该过程是在给定类型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属性, 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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM