使用反射获取属性的字符串名称

时间:2010-09-07 19:06:14

标签: c# reflection propertyinfo

有大量的反思例子可以让你得到:

    1。类中的所有属性

    2。如果您知道字符串名称

    ,则为单个属性

有没有办法(使用反射,TypeDescriptor或其他方法)在运行时获取类中属性的字符串名称,前提是我拥有​​的是类和属性的实例?

修改 我知道我可以使用反射轻松获取类中的所有属性,然后获取每个属性的名称。我要求的是一个函数来给我一个属性的名称,前提是我传递了属性的实例。换句话说,如何从class.GetType()。GetProperty(myProperty)中找到PropertyInfo []数组返回给我的属性,以便从中获取PropertyInfo.Name?

6 个答案:

答案 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;
    }