当前位置:  开发笔记 > 编程语言 > 正文

如何获取特定属性的PropertyInfo?

如何解决《如何获取特定属性的PropertyInfo?》经验,为你挑选了3个好方法。

我想获取特定属性的PropertyInfo.我可以用:

foreach(PropertyInfo p in typeof(MyObject).GetProperties())
{
    if ( p.Name == "MyProperty") { return p }
}

但必须有办法做类似的事情

typeof(MyProperty) as PropertyInfo

在那儿?还是我坚持做一个类型不安全的字符串比较?

干杯.



1> Marc Gravell..:

有一个.NET 3.5方式lambdas/Expression不使用字符串...

using System;
using System.Linq.Expressions;
using System.Reflection;

class Foo
{
    public string Bar { get; set; }
}
static class Program
{
    static void Main()
    {
        PropertyInfo prop = PropertyHelper.GetProperty(x => x.Bar);
    }
}
public static class PropertyHelper
{
    public static PropertyInfo GetProperty(
        Expression> selector)
    {
        Expression body = selector;
        if (body is LambdaExpression)
        {
            body = ((LambdaExpression)body).Body;
        }
        switch (body.NodeType)
        {
            case ExpressionType.MemberAccess:
                return (PropertyInfo)((MemberExpression)body).Member;
            default:
                throw new InvalidOperationException();
        }
    }
}


一个问题:在提取.Body属性之前,为什么对"body是LambdaExpression"进行测试?选择器不是一个LambdaExpression吗?

2> Kevin Kalito..:

您可以使用nameof()属于C#6 的新运算符,并在Visual Studio 2015中提供.此处有更多信息.

对于您的示例,您将使用:

PropertyInfo result = typeof(MyObject).GetProperty(nameof(MyObject.MyProperty));

编译器将转换nameof(MyObject.MyProperty)为字符串"MyProperty",但您可以获得能够重构属性名称而不必记住更改字符串的好处,因为Visual Studio,ReSharper等知道如何重构nameof()值.



3> Vojislav Sto..:

你可以这样做:

typeof(MyObject).GetProperty("MyProperty")

但是,由于C#没有"符号"类型,因此没有什么可以帮助您避免使用字符串.顺便说一句,为什么你称这种类型不安全?


因为它不是在编译时评估的?如果我更改了我的属性名称或者错误输入了代码运行之前我不知道的字符串.
推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有