2013-08-17 4 views
0

다음과 같은 방법으로 개체의 모든 공용 멤버 (필드 및 속성) 이름을 사전 키로 사용하여 Dictionary<string, string>을 반환 할 수 있습니다. 회원의 이름을 알 수는 있지만 그 가치를 알 수는 없습니다. 사람이 어떻게 아래의 방법으로이를 말해 수 :회원 이름 및 값 가져 오기

public Dictionary<String, String> ObjectProperty(object objeto) 
{ 
    Dictionary<String, String> dictionary = new Dictionary<String, String>(); 

    Type type = objeto.GetType(); 
    FieldInfo[] field = type.GetFields(); 
    PropertyInfo[] myPropertyInfo = type.GetProperties(); 

    String value = null; 

    foreach (var propertyInfo in myPropertyInfo) 
    { 
     value = (string)propertyInfo.GetValue(this, null); //Here is the error 
     dictionary.Add(propertyInfo.Name.ToString(), value); 
    } 

    return dictionary; 
} 

오류 :

개체 대상 유형과 일치하지 않습니다. 설명 : 현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 발생했습니다. 오류 및 코드에서 시작된 위치에 대한 자세한 정보는 스택 추적을 검토하십시오.

예외 정보 : System.Reflection.TargetException : 개체가 대상 형식과 일치하지 않습니다. 여기

+0

"오류"? 어떤 오류가 있습니까? –

+0

값을 가져 오기 위해 객체의 인스턴스를 전달하면 안됩니까? –

+1

속성! = 속성 –

답변

2

두 가지 :

  1. 당신은 잘못된 개체의 떨어져 속성을 읽을하려는 의미하는 대신 objeto의, this를 전달하고 있습니다.
  2. 인덱서가 아닌 속성 만 읽으려는 것은 아닙니다. 이에 foreach 문을 변경

시도 :

foreach (var propertyInfo in myPropertyInfo) 
{ 
    if (propertyInfo.GetIndexParameters().Length == 0) 
    { 
     value = (string) propertyInfo.GetValue(objeto, null); 
     dictionary.Add(propertyInfo.Name.ToString(), value); 
    } 
} 
1

메모, 여기 :

foreach (var propertyInfo in myPropertyInfo) 
{ 
    value = (string) propertyInfo.GetValue(this, null); //Here is the error 
    dictionary.Add(propertyInfo.Name.ToString(), value); 

} 

당신은 모든 당신의 재산 문자열 있다고 가정합니다. 그들은?

object objValue = propertyInfo.GetValue(objeto, null);  
value = (objValue == null) ? null : objValue.ToString(); 

위의 코드는 속성 값이 null이 될 수 있음을 고려한다 : 그들은 아니지만, 어쨌든 문자열을 원하는 경우

, 당신은이 코드를 사용할 수 있습니다. 인덱싱 된 속성의 가능성을 고려하지 않았지만 어떤 것이 있으면이를 수용해야합니다.

마찬가지로 Lasse V. Karlsen은 objeto 대신 this을 전달하여 objeto이 아닌 메서드의 부모 클래스에서 속성 값을 가져 오려고합니다. 두 개체가 같은 개체가 아니라면 원하는 결과를 얻을 수 없습니다. 심지어 유형의 유형이 아니라면 오류가 발생합니다.

마지막으로 .NET의 속성 이외의 다른 속성을 참조하는 "특성"이라는 용어를 사용했으며 속성이 아닌 클래스 변수도 참조했습니다. 클래스의 정의에 적용되는 "필드"또는 속성과 달리 속성이 실제로 원하는 것입니까?