2013-05-16 82 views
0

我正在嘗試編寫一個泛型方法來對用戶定義的對象(可能(幾乎總是)有幾個嵌套級別)進行成員比較。我正在找一個發現here的例子,它有一點小小的扭曲;如果該屬性不能與相等運算符(pTypes數組中的那些運算符)進行比較,那麼我想在當前屬性中傳遞遞歸調用。我有的代碼不會編譯,我已經嘗試過遞歸調用中的各種語法,我只是想知道什麼是正確的語法?或者你可以這樣做嗎?智能成員比較 - 對嵌套對象的泛型反射

這是我現在的方法;

public static string[] MemberWiseCompare<T>(T act, T exp) where T : ICommonObject 
    { 
     List<string> errors = new List<string>(); 

     if (act != null && exp != null) 
     { 
      Type[] pTypes = { typeof(int), typeof(bool), typeof(string), typeof(float), typeof(double), typeof(DateTime) }; 
      Type type = typeof(T); 
      foreach (PropertyInfo pi in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)) 
      { 
       if (pTypes.Contains(pi.PropertyType)) 
       { 
        if (type.GetProperty(pi.Name).GetValue(act, null) != type.GetProperty(pi.Name).GetValue(exp, null)) 
        { 
         errors.Add(pi.Name); 
        } 
       } 
       else 
       { 
        string[] innerErrors = MemberWiseCompare<pi.PropertyType>(pi.GetValue(act, null), pi.GetValue(exp, null)); 
       } 
      } 
     } 
     return null; 
    } 

當然也有它我還沒有實現(在該函數的底部聚集的錯誤,並返回null以外的東西)的方法是的,但對於時間的其他部分我只關心與遞歸MemberWiseCompare工作。從那裏我可以找出其餘的。我想我對理解編譯器從我爲泛型指定的類型(即pi.PropertyType)帶來的問題有些問題。我覺得這會起作用,因爲它提供了我們將在通用調用中使用的類型。我也在預料到它會出現一些問題,使我的數值變得更大,以便GetValue返回object而不是更具體的類型。

編輯:編譯器錯誤是好老「最佳重載方法具有一些無效的ARGS」

回答

1

它不會編譯,因爲通用的參數值必須是可用在編譯時。在對MemberWiseCompare的內部調用中,您試圖傳遞一個僅在運行時可用的值。

有趣的是,你並不真的需要它是通用的 - 你使用反射來探索類型,而且你不需要實際的參數編譯時間類型。只要給雙方的行爲和實驗的iCommonObject類型和編輯將通過

+0

Upvoted,因爲這基本上是正確的。但'pTypes'中沒有任何類型實現'ICommonObject',所以我不確定ICommonObject在這裏應該做什麼......?看起來像「對象」是所有需要或將工作。 –

+0

@DominicP - 你是對的,先生。根據發佈對象中的代碼示例,此處應該足夠了 – mfeingold

+0

@DominicP ICommonObject是我們定義的所有對象實現的接口。 pType中的對象是可以與相等運算符進行比較的「基元類型」。包含檢查是爲了確保當前的屬性重載==或對其有本地支持。如果它不是,那麼我知道它是我們的一個對象,所以我需要再次調用'MemberWiseCompare'與該對象,因此它是「原始類型」可以進行比較。 – evanmcdonnal

0

這應該工作:

的String [] innerErrors = MemberWiseCompare(pi.GetValue(ACT,空),pi.GetValue(EXP,空));