2010-04-20 4 views
4

이 질문의 반대쪽을 꽤 많이 보았지만 내가하고 싶은 것을하는 방법을 보지 못했습니다.런타임시 C#에서 속성의 문자열 표현을 가져옵니다.

한다고 가정 나는 다음과 같은 코드가 있습니다

나는이 클래스에 데이터 바인딩을하고자하는 경우
var myNewData = from t in someOtherData 
      select new 
      { 
       fieldName = t.Whatever, 
       fieldName2 = t.SomeOtherWhatever 
      }; 

, 내 열 정의는 "fieldName에"와 "fieldName2"와 같은 하드 코딩 된 문자열을 포함해야합니다.

반사 또는 다른 것을 호출하여 아래 코드와 동등한 작업을 수행 할 수있는 방법이 있습니까? (아래 코드는 유효하지 않지만 유효한 해결책을 찾고 있습니다).

string columnName = GetPropertyName(myNewData[0].fieldName); 

내 목표는 익명의 클래스에 변수 이름 변경, 컴파일 타임 오류가 올 것입니다 경우 모든 참조 런타임까지 확인되지 않은 문자열에 의존하는 현재의 바인딩 데이터와는 달리 고정 될 때까지이다 .

도움을 주시면 감사하겠습니다.

답변

7
string columnName = GetPropertyName(() => myNewData[0].fieldName); 

// ... 

public static string GetPropertyName<T>(Expression<Func<T>> expr) 
{ 
    // error checking etc removed for brevity 

    MemberExpression body = (MemberExpression)expr.Body; 
    return body.Member.Name; 
} 
+0

이것은 정확히 내가 찾고있는 것입니다. 감사. – gwerner

+0

+1 영리한 접근! 필드를 메서드에 전달할 생각이라면 값에 대한 참조 만 전달되므로 전달 된 필드의 이름을 찾을 기회가 없습니다. 그러나 람다를 통해 표현식 트리를 전달하면 그 문제가 해결됩니다. 쿨 솔루션 :) –

2

이처럼 속성 이름을 얻을 :

using System.Reflection;  

var myNewData = from t in someOtherData 
     select new 
     { 
      fieldName = t.Whatever, 
      fieldName2 = t.SomeOtherWhatever 
     }; 


foreach (PropertyInfo pinfo in myNewData.FirstOrDefault() 
           .GetType().GetProperties()) 
{ 
    string name = pinfo.Name; 
} 

// or if you need all strings in a list just use: 
List<string> propertyNames = myNewData.FirstOrDefault() 
      .GetType().GetProperties().Select(x => x.Name).ToList(); 
+0

이건 정말 질문에 대답하지 않습니다. – LukeH

+0

나는 생각한다. OP는 그가 게시 한 코드 라인과 비슷한 것을 어떻게하는지 알고 싶어했다. 익명 타입의 속성 이름을 문자열로 가져 오는 것이다. 그런 다음 문자열 목록을 하드 코딩 된 다른 문자열 목록과 비교하여 익명 형식이 나중에 액세스하려고 시도하는 올바른 속성 집합을 포함하는지 확인할 수 있습니다. –

+0

제 해석에 의하면 OP는 특정 속성을'GetPropertyName' 메쏘드에 전달할 수 있고 그 속성의 이름을 문자열로 반환 할 수 있기를 바랍니다. – LukeH

관련 문제