可能重复:
c# - How do you get a variable’s name as it was physically typed in its declaration?如何将C#属性名称作为带反射的字符串获取?
我正在寻找一种方式来获得一个属性名作为一个字符串,所以我可以有一个“强类型的”神奇的字符串。我需要做的就是像MyClass.SomeProperty.GetName()那样会返回“SomeProperty”。这在C#中可能吗?
可能重复:
c# - How do you get a variable’s name as it was physically typed in its declaration?如何将C#属性名称作为带反射的字符串获取?
我正在寻找一种方式来获得一个属性名作为一个字符串,所以我可以有一个“强类型的”神奇的字符串。我需要做的就是像MyClass.SomeProperty.GetName()那样会返回“SomeProperty”。这在C#中可能吗?
您可以使用表达式轻松实现此目的。看到这个blog for a sample。
这使得您可以通过拉姆达创建表达式,并取出名称。例如,实施INotifyPropertyChanged的可以修改,以做类似:
public int MyProperty {
get { return myProperty; }
set
{
myProperty = value;
RaisePropertyChanged(() => MyProperty);
}
}
为了映射你的等效,使用所引用的“反映”级,你会做这样的事情:
string propertyName = Reflect.GetProperty(() => SomeProperty).Name;
中提琴 - 没有魔术字符串的属性名称。
您可以使用反射来获取对象的属性列表。
MyClass o;
PropertyInfo[] properties = o.GetType().GetProperties(
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance
);
每个属性都有一个名称属性,它会让你 “SomeProperty”
这种方法会比使用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?
这里的最佳答案。我不想循环属性,我想根据实际属性获取属性名称。使用具有第一个(唯一)属性的匿名类型是您想要的名称是天才。 – Paul 2014-06-12 14:15:29
@保罗我不是它背后的天才。其次,它不是非常重构友好的。我的意思是如果你改变属性的名字,匿名类型保留原来的名字。在这种情况下,如果将'SomeProperty'更改为'SomeProperty1',则匿名类将更改为'new {SomeProperty = SomeProperty1}',将打印“SomeProperty”,而不是更新的名称“SomeProperty1”。我会在答案中提到它。 – nawfal 2014-06-12 14:50:12
织补。我预计不会更改属性名称,但如果我曾经这样做,我会希望重构来处理它。谢谢你让我知道。 – Paul 2014-06-12 16:03:34
这里的语法有点讨厌,但它确实做了我所需要的。谢谢! – 2009-11-03 20:53:02