2008-11-15 4 views
0

메서드 매개 변수 값이 나온 속성 이름을 얻는 방법을 알고 싶습니다. 작동 방식은 C 번호는 get 접근과 패스를 호출하여 FIRSTNAME 속성 값을 평가하는 때문에값이 나온 속성 이름 얻기

Person peep = new Person(); 
Dictionary<object, string> mapping = new Dictionary<object, string>(); 
mapping[peep.FirstName] = "Name"; 
Dictionary<string, string> propertyToStringMapping = Convert(mapping); 
if (mapping[peep.FirstName] == propertyToStringMapping["FirstName"]) 
    Console.WriteLine("This is my desired result"); 

private Dictionary<string, string> Convert(Dictionary<object, string> mapping) 
{ 
    Dictionary<string, string> stringMapping = new Dictionary<string, string>(); 
    foreach (KeyValuePair<object, string> kvp in mapping) 
    { 
    //propertyName should eqal "FirstName" 
    string propertyName = kvp.Key?????? 
    stringMapping[propertyName] = kvp.Value; 
    } 
    return stringMapping; 
} 

답변

0

궁극적으로 속성과 연결된 PropertyInfo 개체 또는 개체 매핑 개체의 문자열 표현을 저장해야한다고 생각합니다.

mapping[peep.FirstName] = "Name"; 

이 peep.FirstName 속성의 값과 동일한 키 값을 사전에 항목을 작성 것이고, 값 같음 "이름": 구문, 당신은. 그런 다음 개체의 "FIRSTNAME"속성을 얻기 위해 반사를 사용할 수

mapping["FirstName"] = "Name"; 

: 당신은 같은 문자열로 속성 이름을 저장하는 경우

. 그러나 "엿보기"개체를 변환 기능으로 전달해야합니다. 이것은 당신이하고 싶은 것과는 다소 반대되는 것 같습니다. 그런 다음 변환 기능 당신이 표현을 검사 할 수

var mapping = new Dictionary<Expression<Action<T>>,string>(); 
mapping[ p => p.FirstName ] = "Name"; 

:

당신은 또한 같은 것을 표현 미친 얻을 할 수 있습니다. 이 같은 보일 것이다 :

private Dictionary<string,string> Convert(Dictionary<Expression<Action<T>>,string> mapping) 
{ 
    var result = new Dictionary<string,string>(); 
    foreach(var item in mapping) 
    { 
     LambdaExpression ex = item.Key as LambdaExpression; 
     string propertyName = ((MemberExpression)ex.Body).Member.Name; 
     string propertyValue = item.Value; 
     result.Add(propertyName,proeprtyValue); 
    } 
    return result; 
} 

이 더 많거나 내 머리 위로 떨어져 적은을, 그래서 나는 조금 떨어져 표현 유형을 가질 수있다. 이 구현에 문제가있는 경우 알려 주시면 기능적인 예를 알아낼 수 있는지 확인하겠습니다.

1

당신은이 방법으로 그렇게 할 수 없습니다 : 아래의 코드는 내가하고 싶은 것을 보여줍니다 사전의 인덱서에 대한 값. 따라서 FirstName 값을 찾은 방법은 완전히 손실됩니다. 그냥 2 + 2를 계산하는 방식과 같습니다. "x = 2 + 2"라고 쓰면 x는 4의 값을 가지지 만 3 + 1인지 2 + 2인지 아니면 5+인지 알 수있는 방법이 없습니다. (-1) 또는 ... 4로 계산 된 것입니다.

0

나는 C#에 관해 많이 모른다. 그러나 들여다은 enum인가? Java의 경우 다음과 같이 할 수 있습니다.

String propertyName = kvp.key.toString() 

어쩌면 C#과 비슷한 것이 있을까요?

엿보기가 열거 형이 아니더라도 : 키가 임의의 개체 여야하는 이유가 없습니다. 어쩌면 해결책은 정확하게 키의 유형으로 열거 형을 사용하는 것입니까?

또한 무엇을 하려는지는 알 수 없지만 일반적으로 열거 형 키를 문자열로 변환하는 것은 좋지 않습니다. 열거 형으로 할 수없는 일을 문자열로 무엇을 할 수 있습니까?