2010-02-16 22 views
0

給出如下所示的類,如何找到一個特定屬性的名稱?從C#3.5中的類中找到某個類的特定屬性的名稱

public class Student 
{ 
    public int Grade 
    { 
     get; 
     set; 
    } 

    public string TheNameOfTheGradeProperty 
    { 
     get 
     { 
      return ???? 
     } 
    } 

    // More properties..  
} 

所以我想從TheNameOfTheGradeProperty屬性返回字符串「級」。我問的原因是我不想使用硬編碼字符串,而是使用lambda表達式或其他。

我該如何實現這個目標?

+2

除非你以某種方式引用屬性要返回的名字,它是不可能的,如果你是這樣做,你可能只是使用硬編碼的字符串。你可以使用反射,但目前對我來說似乎毫無意義。你的要求是什麼? – johnc

+2

@johnc在數據綁定的某些時候需要屬性的名稱,並不是所有的重構工具在重命名屬性時都會考慮字符串文字 –

+0

@johnc ...除了下面的答案顯示如何在不使用硬盤的情況下完成請求編碼的字符串。 –

回答

1
using System.Reflection; 

return typeof(Student).GetProperty("Grade").Name; 

但正如你所看到的,你不是那麼遠使用反射(以這種方式),因爲「級」字符串仍硬編碼,這意味着在這種情況下它更高效的只是return "Grade"


我喜歡做的一件事就是創建一個自定義屬性並添加到像這樣的成員。 以下內容可以防止您使用硬編碼字符串「Grade」。

public class Student { 

// TAG MEMBER WITH CUSTOM ATTRIBUTE 
[GradeAttribute()] 
public int Grade 
{ 
    get; 
    set; 
} 

public string TheNameOfTheGradeProperty 
{ 
    get 
    { 
     /* Use Reflection. 
      Loop over properties of this class and return the 
      name of the one that is tagged with the 
      custom attribute of type GradeAttribute. 
     */ 
    } 
} 

// More properties..  

} 

Creating custom attributes can be found here

+0

我無法停止對這個答案咧嘴笑。 – johnc

+0

@johnc:這是老式的,考慮到3.x特性,並且可能對屬性使用不當,但它仍然是一個選項。不是一個「自豪的時刻」雖然:) –

+0

沒有錯的代碼,我只是在簡單的返回「成績」的美妙迷惑逗樂了。我確信他有這個要求,我現在不知道它是什麼 – johnc

1

你有一個很奇怪的要求。你是否說你不想使用硬編碼的字符串,因爲如果你重構類,你想TheNameOfTheGradeProperty保持最新?如果是的話,這裏有一個奇怪的方式這樣做:

public class Student 
{ 
    public int Grade { get; set; } 

    public string TheNameOfTheGradeProperty 
    { 
     get 
     { 
      Expression<Func<int>> gradeExpr =() => this.Grade; 
      MemberExpression body = gradeExpr.Body as MemberExpression; 
      return body.Member.Name; 
     } 
    } 
} 
+0

+1對於奇怪的回答排位奇怪的請求 –

2

它可以使用表達式查找屬性的名稱,使用您可以使用它的任何對象的簡單擴展方法...如果你需要將其限制在一組對象可以申請在T.希望通用約束這有助於

public class Student 
{ 
    public int Grade { get; set;} 
    public string Name { get; set; } 

    public string GradePropertyName 
    { 
     get { return this.PropertyName(s => s.Grade); } 
    } 

    public string NamePropertyName 
    { 
     get { return this.PropertyName(s => s.Name); } 
    } 
} 

public static class Helper 
{ 
    public static string PropertyName<T, TProperty>(this T instance, Expression<Func<T, TProperty>> expression) 
    { 
     var property = expression.Body as MemberExpression; 

     if (property != null) 
     { 
      var info = property.Member as PropertyInfo; 
      if (info != null) 
      { 
       return info.Name; 
      } 
     } 

     throw new ArgumentException("Expression is not a property"); 
    } 
} 
+0

比我的更好。投票。 –

相關問題