我正在嘗試編寫一個泛型方法來對用戶定義的對象(可能(幾乎總是)有幾個嵌套級別)進行成員比較。我正在找一個發現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」
Upvoted,因爲這基本上是正確的。但'pTypes'中沒有任何類型實現'ICommonObject',所以我不確定ICommonObject在這裏應該做什麼......?看起來像「對象」是所有需要或將工作。 –
@DominicP - 你是對的,先生。根據發佈對象中的代碼示例,此處應該足夠了 – mfeingold
@DominicP ICommonObject是我們定義的所有對象實現的接口。 pType中的對象是可以與相等運算符進行比較的「基元類型」。包含檢查是爲了確保當前的屬性重載==或對其有本地支持。如果它不是,那麼我知道它是我們的一個對象,所以我需要再次調用'MemberWiseCompare'與該對象,因此它是「原始類型」可以進行比較。 – evanmcdonnal