使用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()
为myClassInstance
types的所有公共属性提供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; }