如何将C#属性名称作为带反射的字符串?

时间:2009-11-03 17:47:41

标签: c# reflection

  

可能重复:
  c# - How do you get a variable’s name as it was physically typed in its declaration?

我正在寻找一种方法来获取属性名称作为字符串,这样我就可以拥有一个“强类型”魔术字符串。我需要做的是像MyClass.SomeProperty.GetName()这样会返回“SomeProperty”。这在C#中是否可行?

3 个答案:

答案 0 :(得分:9)

这种方法比使用Expression

更快
public static string GetName<T>(this T item) where T : class
{
    if (item == null)
        return string.Empty;

    return typeof(T).GetProperties()[0].Name;
}

现在你可以打电话给它:

new { MyClass.SomeProperty }.GetName();

如果您需要更高的性能,可以缓存值。请参阅此重复问题How do you get a variable's name as it was physically typed in its declaration?

答案 1 :(得分:6)

您可以使用表达式轻松实现此目的。请参阅此blog for a sample

这使得你可以通过lambda创建一个表达式,然后拉出名字。例如,可以重新实现INotifyPropertyChanged以执行以下操作:

public int MyProperty {
    get { return myProperty; }
    set
    {
        myProperty = value;
        RaisePropertyChanged( () => MyProperty );
    }
}

为了映射你的等价物,使用引用的“反射”类,你会做类似的事情:

string propertyName = Reflect.GetProperty(() => SomeProperty).Name;

Viola - 没有魔术字符串的属性名称。

答案 2 :(得分:2)

您可以使用反射获取对象的属性列表。

MyClass o;

PropertyInfo[] properties = o.GetType().GetProperties(
    BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance
);

每个属性都有一个Name属性,可以获得“SomeProperty”