.Net获取属性名称

时间:2010-07-27 08:00:35

标签: .net

我想获取一个属性的名称,例如:

Dim _foo As String

Public Property Foo as String
Get
   Return _foo
End Get
Private Set(ByVal value as String)
   _foo = value
End Set

Sub Main()
  Console.Write(Foo.Name)'Outputs "Foo"
End Sub

任何想法如何?

4 个答案:

答案 0 :(得分:24)

你的意思是财产,还是指一个领域?

有获取属性名称的聪明的lambda技术 - 这是一个C#示例:

String GetPropertyName<TValue>(Expression<Func<TValue>> propertyId)
{
   return ((MemberExpression)propertyId.Body).Member.Name;
}

这样称呼:

GetPropertyName(() => MyProperty)

它将返回“MyProperty”

不确定这是不是你想要的。

答案 1 :(得分:9)

如果您使用的是C#6.0(在询问此问题时未发布),您可以使用nameof(PropertyName)这在编译时进行评估并转换为字符串,使用nameof()的好处是您在重构时不必手动更改字符串。 (nameof不仅适用于属性,CallerMemberName更具限制性)

如果您仍然停留在预编号6.0,那么您可以使用CallerMemberNameAttribute(它需要.net 4.5)

private static string Get([System.Runtime.CompilerServices.CallerMemberName] string name = "")
{
    if (string.IsNullOrEmpty(name))
        throw new ArgumentNullException("name");
    return name;
}

答案 2 :(得分:3)

public static PropertyInfo GetPropInfo<T>(this T @object
    , Expression<Action<T>> propSelector)
{
    MemberExpression exp= propSelector.Body as MemberExpression;
    return exp.Member as PropertyInfo;
}

然后像这样使用它:

string str = ....
string propertyName = str.GetPropInfo(a => a.Length).Name;

请注意,上述方法是一个扩展,应该用静态类编写,并通过包含命名空间

来使用

答案 3 :(得分:0)

通过反思。使用该类型的GetType()方法,然后查看GetProperties()方法和PropertyInfo类。 (如果你想检索字符串“propertyName”(对于名为propertyName的字段 - 请使用xxx.GetType()。GetFields()[0] .Name如果它是类中的第一个字段。