可能重复:
c# - How do you get a variable’s name as it was physically typed in its declaration?
我正在寻找一种方法来获取属性名称作为字符串,这样我就可以拥有一个“强类型”魔术字符串。我需要做的是像MyClass.SomeProperty.GetName()这样会返回“SomeProperty”。这在C#中是否可行?
答案 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”