簡體   English   中英

使用反射來比較列表中的對象

[英]using reflection to compare object in list

我有一個“發票” WinForm C#,其中包含常用的文本框和未綁定的datagridview。 我使用了“發票”類對象來存儲表單字段的值。 datagridview行存儲到“發票”中的List <SubInvoice>屬性。

public static bool CompareObjects(object original, object altered)
{
    Type o = original.GetType();
    Type a = altered.GetType();

    foreach (PropertyInfo p in o.GetProperties(BindingFlags.Public | BindingFlags.Instance))
    {
        Console.WriteLine("Original: {0} = {1}", p.Name, p.GetValue(original, null));
        Console.WriteLine("Altered: {0} = {1}", p.Name, p.GetValue(altered, null));

        if (p.GetValue(original, null).ToString() != p.GetValue(altered, null).ToString())
        {
            //Console.WriteLine("Not Equal");
            return false;
        }
    }

    return true;
}

我正在使用一個全局類,其方法使用反射來遍歷原始“發票”對象,並將其與更改后的“發票”進行比較。 如果有任何差異,將通知用戶保存發票。

上面的方法在'Invoice'類的所有屬性下都可以正常工作,但是我不知道如何檢查將每個數據網格的值存儲在其中的'SubInvoice'類對象中的List,該對象將其存儲為列表中的對象。

有人可以在這里給我一些幫助嗎? 我也檢查了stackoverflow和其他論壇中的類似線程,但是徒勞。

更新:我需要創建一個全局通用方法,該方法將檢查所有類型的類。 可以是“發票”,“客戶”。 目的是跟蹤在任何特定實例對表單所做的任何更改,並提示用戶進行保存。

如果您只是想通知用戶保存待處理的更改,則應該實現INotifyPropertyChanged而不是做一些不可思議的事情。

我之前見過的一個技巧是將對象標記為可序列化,然后將它們序列化為字符串並比較字符串。 它可能不是最有效的方法,但是它是快速,容易的,並且適用於幾乎所有類型的數據類。 它甚至適用於引用了其他類的“復雜”嵌套類。

缺點是它不會輕易告訴您具體更改了什么,只是有所不同。

謝謝大家的幫助。

我偶然接觸了以下文章,但仍然渴望通過反射創建一個全局通用方法。

http://www.c-sharpcorner.com/UploadFile/1a81c5/custom-extension-method-to-compare-list-in-C-Sharp/

如果有人感興趣,這是代碼。

public static bool CompareObjects(object original, object altered)
{
    bool result = true;

    //Get the class
    Type o = original.GetType();
    Type a = altered.GetType();

    //Cycle through the properties.
    foreach (PropertyInfo p in o.GetProperties(BindingFlags.Public | BindingFlags.Instance))
    {
        Console.WriteLine("Original: {0} = {1}", p.Name, p.GetValue(original, null));
        Console.WriteLine("Altered: {0} = {1}", p.Name, p.GetValue(altered, null));

        if (!p.PropertyType.IsGenericType)
        {
            if (p.GetValue(original, null) != null && p.GetValue(altered, null) != null)
            {
                if (!p.GetValue(original, null).ToString().Equals(p.GetValue(altered, null).ToString()))
                {
                    result = false;
                    break;
                }
            }
            else
            {
                //If one is null, the other is not
                if ((p.GetValue(original, null) == null && p.GetValue(altered, null) != null) || (p.GetValue(original, null) != null && p.GetValue(altered, null) == null))
                {
                    result = false;
                    break;
                }
            }
        }
    }

    return result;
}

public static bool CompareLists<T>(this List<T> original, List<T> altered)
{
    bool result = true;

    if (original.Count != altered.Count)
    {
        return false;
    }
    else
    {
        if (original != null && altered != null)
        {
            foreach (T item in original)
            {
                T object1 = item;
                T object2 = altered.ElementAt(original.IndexOf(item));

                Type objectType = typeof(T);

                if ((object1 == null && object2 != null) || (object1 != null && object2 == null))
                {
                    result = false;
                    break;
                }

                if (!CompareObjects(object1, object2))
                {
                    result = false;
                    break;
                }
            }
        }
        else
        {
            if ((original == null && altered != null) || (original != null && altered == null))
            {
                return false;
            }
        }
    }

    return result;
}

用法: if(!xx.CompareObjects(searchedInvoice,alteredInvoice)|!xx.CompareLists(searchedInvoice.SubInvoice,alteredInvoice.SubInvoice))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM