使用reflection获取属性的string名称

这里有很多reflection的例子可以让你得到:

    1.class级中的所有属性

    2.一个单一的属性,提供你知道的string名称

有没有一种方法(使用reflection,TypeDescriptor,或其他)来获取在运行时类中的属性的string名称,只要我有一个类和属性的实例?

编辑我知道,我可以很容易地获得在一个类中使用reflection的所有属性,然后获取每个属性的名称。 我要求的是一个函数,给我一个财产的名称,只要我通过它的财产的实例。 换句话说,如何从PropertyInfo []数组中find属性,并从Class.GetType()。GetProperty(myProperty)返回给我,以便我可以从中获取PropertyInfo.Name?

如果你已经有一个PropertyInfo ,那么@ dtb的答案是正确的。 但是,如果要查找当前正在使用哪个属性的代码,则必须遍历当前的调用堆栈以找出当前正在执行的方法,并从中派生出属性名称。

 var stackTrace = new StackTrace(); var frames = stackTrace.GetFrames(); var thisFrame = frames[0]; var method = thisFrame.GetMethod(); var methodName = method.Name; // Should be get_* or set_* var propertyName = method.Name.Substring(4); 

编辑:

澄清之后,我想知道你想要做的是从属性expression式获取属性的名称。 如果是这样,你可能想写一个像这样的方法:

 public static string GetPropertyName<T>(Expression<Func<T>> propertyExpression) { return (propertyExpression.Body as MemberExpression).Member.Name; } 

要使用它,你会写这样的东西:

 var propertyName = GetPropertyName( () => myObject.AProperty); // returns "AProperty" 

使用C#6.0(Visual Studio 2015),现在可以使用nameof操作符,如下所示:

 var obj = new MyObject(); string propertyName = nameof(obj.Property); string methodName = nameof(obj.Method); string directPropertyName = nameof(MyObject.Property); string directMethodName = nameof(MyObject.Method); 

PropertyInfo.Name

如果有人需要它…这是答案的VB.net版本:

 Public Shared Function GetPropertyName(Of t)(ByVal PropertyExp As Expression(Of Func(Of t))) As String Return TryCast(PropertyExp.Body, MemberExpression).Member.Name End Function 

用法:

 Dim name As String = GetPropertyName(Function() (New myObject).AProperty) 

acutully正确的答案是由TKTS写的,在这里,我只是想将他的语法转换为C#

 public static string GetPropertyName<t>(Expression<Func<t>> PropertyExp) { return (PropertyExp.Body as MemberExpression).Member.Name; } 

这个代码的用法如下例子:

 string name = GetPropertyName(() => (new Tasks()).Title); 

此外:有一个例外可能会发生,当所有的属性都有空值,所以当他实施他的代码时,任何人都必须把他的专注

谢谢TKTS ..

myClassInstance.GetType().GetProperties()myClassInstancetypes的所有公共属性提供PropertyInfo实例。 (请参阅MSDN文档和其他重载。)“属性信息名称”是属性的实际名称。 如果您已经知道该属性的名称,请使用GetProperty(name)来检索其PropertyInfo对象(请再次参阅MSDN )。

我使用雅各提供的版本,但有时它给了一个例外。 这是因为演员是无效的。 这个版本解决了这个问题:

  public static string GetPropertyName<T>(this Expression<Func<T>> propertyExpression) { ConstantExpression cExpr = propertyExpression.Body as ConstantExpression; MemberExpression mExpr = propertyExpression.Body as MemberExpression; if (cExpr != null) return cExpr.Value.ToString(); else if (mExpr != null) return mExpr.Member.Name; else return null; }