49

有大量的反射示例可以让您获得:

    1.一个类中的所有属性

    2. 单个属性,前提是您知道字符串名称

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

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

4

7 回答 7

97

如果您已经有一个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"
于 2010-09-07T19:12:46.430 回答
61

使用 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);
于 2015-07-24T15:46:06.173 回答
16

属性信息名称

于 2010-09-07T19:09:13.043 回答
6

万一有人需要……这是答案的 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)
于 2011-01-10T16:23:35.907 回答
3

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 ..

于 2015-05-03T11:04:59.140 回答
1

我使用了 Jacob 提供的版本,但有时会出现异常。这是因为演员阵容无效。这个版本解决了这个问题:

    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;
    }
于 2013-12-15T21:20:42.620 回答
0

myClassInstance.GetType().GetProperties()为您提供's 类型PropertyInfo的所有公共属性的实例。myClassInstance(有关文档和其他重载,请参阅MSDN。)“PropertyInfo.Name”是属性的实际名称。如果您已经知道GetProperty(name)用于检索其PropertyInfo对象的属性名称(再次参见MSDN)。

于 2010-09-07T19:12:33.877 回答