如何将C#属性名作为带反射的字符串获取?
可能重复:如何将C#属性名作为带反射的字符串获取?,c#,reflection,C#,Reflection,可能重复: 我正在寻找一种将属性名作为字符串的方法,这样我就可以拥有一个“强类型”的神奇字符串。我需要做的是类似MyClass.SomeProperty.GetName()的操作,它将返回“SomeProperty”。这在C#中可能吗?您可以使用表达式很容易地实现这一点。看这个 这使得您可以通过lambda创建表达式,并提取名称。例如,可以对实现INotifyPropertyChanged进行返工,以执行以下操作: public int MyProperty { get { retur
我正在寻找一种将属性名作为字符串的方法,这样我就可以拥有一个“强类型”的神奇字符串。我需要做的是类似MyClass.SomeProperty.GetName()的操作,它将返回“SomeProperty”。这在C#中可能吗?您可以使用表达式很容易地实现这一点。看这个 这使得您可以通过lambda创建表达式,并提取名称。例如,可以对实现INotifyPropertyChanged进行返工,以执行以下操作:
public int MyProperty {
get { return myProperty; }
set
{
myProperty = value;
RaisePropertyChanged( () => MyProperty );
}
}
string propertyName = Reflect.GetProperty(() => SomeProperty).Name;
为了映射等效对象,使用引用的“Reflect”类,您可以执行以下操作:
public int MyProperty {
get { return myProperty; }
set
{
myProperty = value;
RaisePropertyChanged( () => MyProperty );
}
}
string propertyName = Reflect.GetProperty(() => SomeProperty).Name;
Viola-没有魔术字符串的属性名。您可以使用反射获得对象属性的列表
MyClass o;
PropertyInfo[] properties = o.GetType().GetProperties(
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance
);
每个属性都有一个Name属性,它将为您提供“SomeProperty”这种方法比使用
表达式要快得多
public static string GetName<T>(this T item) where T : class
{
if (item == null)
return string.Empty;
return typeof(T).GetProperties()[0].Name;
}
如果需要更高的性能,可以缓存值。请看这个重复的问题这里的语法有点糟糕,但它确实起到了我所需要的作用。谢谢最好的答案在这里。我不想循环属性,我想基于实际属性获取属性名称。使用匿名类型,并且第一个(唯一)属性是您想要的名称来源是genius。@Paul我不是背后的天才。其次,它对重构不是很友好。我的意思是,如果更改属性的名称,匿名类型将保留原始名称。在这种情况下,如果将SomeProperty
更改为SomeProperty1
,则匿名类将更改为new{SomeProperty=SomeProperty1}
,这将打印“SomeProperty”,而不是更新后的名称“SomeProperty1”。我会在回答中提到的。该死的。我不希望更改属性名称,但如果我更改了,我希望重构能够处理它。谢谢你让我知道。如果MyClass在执行时为null,这也会失败。表达方法将会成功。在绝大多数情况下,这不会成为问题,因为您将在其他地方获得null引用异常,但可能值得指出。@Pedro77您必须首先在静态类中编写扩展方法。