2010-02-16 2 views
0

아래와 같이 클래스를 지정하면 particluar 속성 하나의 이름을 어떻게 찾을 수 있습니까?C# 3.5의 클래스 내에서 클래스의 특정 속성 이름 찾기

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

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

    // More properties..  
} 

그래서 TheNameOfTheGradeProperty 속성에서 문자열 "등급"를 반환하고 싶습니다. 내가 물어 보는 이유는 하드 코딩 된 문자열을 사용하고 싶지 않고 람다 식 또는 다른 것을 사용하기를 원하기 때문입니다.

어떻게하면됩니까?

+2

이름을 반환하려는 속성을 어떻게 든 참조하지 않으면 불가능하며 그렇지 않은 경우 그렇게하면 하드 코딩 된 문자열을 사용할 수도 있습니다. 리플렉션을 사용할 수는 있지만 지금은 나에게 무의미한 것처럼 보입니다. 귀하의 요구 사항은 무엇입니까? – johnc

+2

@johnc 데이터 바인딩을 할 때 속성의 이름이 필요한 경우가 있습니다. 모든 리팩토링 도구가 속성 이름을 바꿀 때 문자열 리터럴을 고려하지 않을 때 –

+0

@johnc ... 하드를 사용하지 않고 요청을 수행하는 방법을 보여주는 아래 답변을 제외하고 부호화 된 문자열. –

답변

1
using System.Reflection; 

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

그러나 당신이 볼 수 있듯이, 당신은 훨씬 앞서 아니에요은 "학년"문자열은 여전히 ​​그냥 return "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

코드에 아무런 문제가 없으며 간단한 반환 인 "Grade"의 멋진 난독 처리에서 즐겁습니다. 나는 그가 가지고있는 요구 사항이 있다고 확신한다, 나는 단지 그것이 지금 무엇인지 모른다. – 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

나의 것보다 낫다. 투표했다. –

관련 문제