如何获取特定属性的PropertyInfo?


79

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

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

但是必须有一种方法可以做类似

typeof(MyProperty) as PropertyInfo

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

干杯。

Answers:


59

您可以使用新的nameof()操作符是C#6和可用的一部分在Visual Studio 2015年更多信息在这里

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

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

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


1
如果您的示例以PropertyInfo result =而不是开头,则可以说可以更清楚一点var result =
DavidRR

133

带有lambdas /的.NET 3.5方式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<Foo>.GetProperty(x => x.Bar);
    }
}
public static class PropertyHelper<T>
{
    public static PropertyInfo GetProperty<TValue>(
        Expression<Func<T, TValue>> 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();
        }
    }
}

不错的解决方案,但不幸的是我没有使用.NET3.5。不过,打勾!
tenpn

1
在2.0中,Vojislav Stojkovic的答案是您可以获得的最接近的答案。
马克·格雷韦尔

4
一个问题:为什么在提取.Body属性之前对“ body is LambdaExpression”进行测试?选择器不是总是LambdaExpression吗?
tigrou 2012年

@tigrou很可能只是一个疏忽,也许我借用了与之相反的现有代码Expression
Marc Gravell

@MarcGravell这个实现不是很好。如果使用,则无法获取正确的属性信息PropertyHelper<Derived>.GetProperty(x => x.BaseProperty);。见stackoverflow.com/questions/6658669/...
nawfal

12

你可以这样做:

typeof(MyObject).GetProperty("MyProperty")

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


38
因为它不是在编译时评估的?如果我更改了属性名称或键入了字符串,直到代码运行后我才知道。
tenpn

1

反射用于运行时类型评估。因此,您的字符串常量无法在编译时进行验证。


5
这就是OP试图避免的事情。不知道这是否能回答问题。
nawfal 2013年

尽管避免硬编码字符串似乎仍然是最干净的解决方案,但是关于编译时间与运行时间以及OP的原始意图的要点似乎是最干净的解决方案-避免了输入错误的可能性,可以简化重构并提供更简洁的代码样式。
Brian Sweeney 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.