有大量的反思例子可以让你得到:
1。类中的所有属性
2。如果您知道字符串名称
,则为单个属性有没有办法(使用反射,TypeDescriptor或其他方法)在运行时获取类中属性的字符串名称,前提是我拥有的是类和属性的实例?
修改 我知道我可以使用反射轻松获取类中的所有属性,然后获取每个属性的名称。我要求的是一个函数来给我一个属性的名称,前提是我传递了属性的实例。换句话说,如何从class.GetType()。GetProperty(myProperty)中找到PropertyInfo []数组返回给我的属性,以便从中获取PropertyInfo.Name?
答案 0 :(得分:87)
如果您已经有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);
修改强>
在您澄清之后,我想知道您想要做的是从属性表达式获取属性的名称。如果是这样,您可能想要编写如下方法:
public static string GetPropertyName<T>(Expression<Func<T>> propertyExpression)
{
return (propertyExpression.Body as MemberExpression).Member.Name;
}
要使用它,你会写这样的东西:
var propertyName = GetPropertyName(
() => myObject.AProperty); // returns "AProperty"
答案 1 :(得分:46)
使用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);
答案 2 :(得分:13)
答案 3 :(得分:5)
如果有人需要它......这里是答案的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)
答案 4 :(得分:0)
myClassInstance.GetType().GetProperties()
为PropertyInfo
类型的所有公共属性提供了myClassInstance
个实例。 (有关文档和其他重载,请参阅MSDN。)'PropertyInfo.Name'是属性的实际名称。如果您已经知道该属性的名称,请使用GetProperty(name)
来检索其PropertyInfo
对象(请再次参阅MSDN)。
答案 5 :(得分:0)
我使用的是雅各布提供的版本,但有时它会例外。这是因为演员阵容无效。这个版本解决了这个问题:
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;
}