2011-02-07 18 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級) - 名稱,值和類型。

目前,我有兩個方法(以下definations):

public List<MyPropertyInfo> GetMyProperties(Type type); 

public List<MyPropertyInfo> GetMyProperties(object obj); 

我用第一個以顯示所選方法的所有參數的清單連同它的屬性 - 名稱,值和類型。

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(object obj)用於列出返回對象。因爲我不知道編譯時所選方法的返回類型,所以使用對象類型。我想知道是否可以修改第二種方法來使用它讀取參數,屬性和返回類型?而不是分開的方法?試圖重用代碼。

回答

0

我不確定我是否正確理解你,但是如果你想在一個方法中結合兩個方法,你可以在兩種情況下都傳遞對象,但是檢查對象是否是Type併爲這種情況提供不同的邏輯:

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

這是否意味着我需要爲這兩種情況編寫相同的代碼片段?由於邏輯 - 檢查給定類型/對象的屬性 - 名稱/值/類型是相同的。我想將這兩種方法結合起來,以形成一個共同的邏輯。給定對象,我將遍歷所有屬性並返回所需的屬性。可能是我在這裏失去了一些東西? – 2011-02-08 14:46:26

相關問題