2009-11-03 91 views

回答

6

您可以使用表达式轻松实现此目的。看到这个blog for a sample

这使得您可以通过拉姆达创建表达式,并取出名称。例如,实施INotifyPropertyChanged的可以修改,以做类似:

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

为了映射你的等效,使用所引用的“反映”级,你会做这样的事情:

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

中提琴 - 没有魔术字符串的属性名称。

+0

这里的语法有点讨厌,但它确实做了我所需要的。谢谢! – 2009-11-03 20:53:02

1

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

MyClass o; 

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

每个属性都有一个名称属性,它会让你 “SomeProperty”

8

这种方法会比使用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?

+0

这里的最佳答案。我不想循环属性,我想根据实际属性获取属性名称。使用具有第一个(唯一)属性的匿名类型是您想要的名称是天才。 – Paul 2014-06-12 14:15:29

+0

@保罗我不是它背后的天才。其次,它不是非常重构友好的。我的意思是如果你改变属性的名字,匿名类型保留原来的名字。在这种情况下,如果将'SomeProperty'更改为'SomeProperty1',则匿名类将更改为'new {SomeProperty = SomeProperty1}',将打印“SomeProperty”,而不是更新的名称“SomeProperty1”。我会在答案中提到它。 – nawfal 2014-06-12 14:50:12

+0

织补。我预计不会更改属性名称,但如果我曾经这样做,我会希望重构来处理它。谢谢你让我知道。 – Paul 2014-06-12 16:03:34

相关问题