我想获取特定属性的PropertyInfo。我可以使用:
foreach(PropertyInfo p in typeof(MyObject).GetProperties())
{
if ( p.Name == "MyProperty") { return p }
}
但是必须有一种方法可以做类似
typeof(MyProperty) as PropertyInfo
在那儿?还是我坚持进行类型不安全的字符串比较?
干杯。
Answers:
您可以使用新的nameof()
操作符是C#6和可用的一部分在Visual Studio 2015年更多信息在这里。
对于您的示例,您将使用:
PropertyInfo result = typeof(MyObject).GetProperty(nameof(MyObject.MyProperty));
编译器将转换nameof(MyObject.MyProperty)
为字符串“ MyProperty”,但由于Visual Studio,ReSharper等知道如何重构nameof()
值,因此您可以重构属性名称而不必记住更改字符串,从而获得了好处。
带有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();
}
}
}
Expression
PropertyHelper<Derived>.GetProperty(x => x.BaseProperty);
。见stackoverflow.com/questions/6658669/...
你可以这样做:
typeof(MyObject).GetProperty("MyProperty")
但是,由于C#没有“符号”类型,因此没有什么可以帮助您避免使用字符串。顺便说一下,为什么将这种类型称为不安全?
反射用于运行时类型评估。因此,您的字符串常量无法在编译时进行验证。
PropertyInfo result =
而不是开头,则可以说可以更清楚一点var result =
。