2011-02-07 3 views
0

이전 스레드와의 연속 사용 Using reflection read properties of an object containing array of another object. EvgK에서이 훌륭한 방법을 제 코드 기반의 여러 위치에서 사용할 수있는 제네릭 방식으로 만들고 싶습니다.C#을 사용하여 런타임에 매개 변수, 속성 및 반환 형식을 읽는 한 가지 방법

public static void GetMyProperties(object obj) 
{ 
    List<MyPropertyInfo> oMyProp = new List<MyPropertyInfo>(); 
    foreach (PropertyInfo pinfo in obj.GetType().GetProperties()) 
    { 

     if (!Helper.IsCustomType(pinfo.PropertyType)) 
     { 
      //add properties - name, value, type to the list 
     } 
     else 
     { 
      var getMethod = pinfo.GetGetMethod(); 

      if (getMethod.ReturnType.IsArray) 
      { 
       var arrayObject = getMethod.Invoke(obj, null); 
       foreach (object element in (Array)arrayObject) 
       { 
        foreach (PropertyInfo arrayObjPinfo in element.GetType().GetProperties()) 
        { 
         //add properties - name, value, type to the list 
        } 
       } 
      } 
      else 
      { 
       List<MyPropertyInfo> oTempMyProp = GetMyProperties(prop.GetValue(obj, null)); 
       oMyProp.AddRange(oTempMyProp); 
      } 
     } 


    } 
} 

다시 말해서 사용자가 전달한 메서드를 읽으려고합니다. 매개 변수, 속성 및 값을 나열합니다. 사용자가 입력 값을 제공하면 메서드를 동적으로 호출하여 결과 개체를 가져옵니다. 결과는 GetMyProperties() 메서드에 전달되고 메서드는 이름, 값 및 형식의 모든 속성 (n 수준)을 나열합니다. - 이름, 값 및 유형

public List<MyPropertyInfo> GetMyProperties(Type type); 

public List<MyPropertyInfo> GetMyProperties(object obj); 

내가 그 속성의와 함께 선택한 방법의 모든 매개 변수의 목록을 표시하는 최초의 하나를 사용

현재, 나는 두 가지 방법 (아래 definations)가 있습니다.

MethodInfo members = type.GetMethod(this.MethodName); 
ParameterInfo[] parameters = members.GetParameters(); 
List<MyPropertyInfo> oMyProp = new List<MyPropertyInfo>(); 
foreach (var parameter in parameters) 
{ 
    oMyProp = GetMyProperties(parameter.ParameterType);  
} 

. 사용자가 매개 변수를 입력 할 수 있도록 내 속성 목록을 만듭니다. ParameterType과 GetProperties 메서드가 사용자 지정 형식인지 확인합니다. 사용자 정의 유형의 경우 입력을 위해 표에 바인딩하는 목록을 작성하기 위해 재귀 적으로 유형을 호출합니다.

두 번째 방법 인 GetMyProperties (개체 obj)는 반환 개체를 나열하는 데 사용됩니다. 컴파일 시간에 선택한 메서드의 반환 형식을 알 수 없으므로 개체 형식을 사용합니다. 두 번째 메서드를 어떻게 든 매개 변수, 속성 및 반환 형식을 읽는 데 사용하도록 수정할 수 있는지 알고 싶습니다. 별도의 방법을 사용하는 대신? 코드를 재사용하려고합니다.

답변

0

정확하게 이해할 수 있을지 모르겠지만 두 가지 방법을 하나로 결합하려는 경우 두 경우 모두 개체를 전달할 수 있지만 개체가 유형인지 여부를 확인하고 해당 경우 다른 논리를 제공하십시오.

public static void GetMyProperties(object obj) 
{ 
    if (obj is Type) 
    { 
     Type type = obj as Type; 
     ... here is the first method logic ... 
    } 
    else 
    { 
     ... here is the second method logic ... 
    } 
} 
+0

두 시나리오 모두에서 동일한 코드를 작성해야합니까? 논리 - 주어진 유형/객체에 대한 속성 - 이름/값/유형을 검사하기 때문에 동일합니다. 나는 두 가지 방법을 결합하여 하나의 공통 논리를 가질 것을 생각했다. 개체가 주어지면 모든 속성을 반복하고 필요한 특성을 반환합니다. 여기에 뭔가 빠져있을 수 있습니까? –