通用比较功能

时间:2019-07-12 11:26:07

标签: c#

我正在尝试创建一个通用的比较函数,以查看某个类的两个实例是否可以保存为List <>的成员变量。

bool IsEqual<T>(T a, T b)
{
    var props = typeof(T).GetProperties();
    foreach(var property in props)
    {
        var aVal = property.GetValue(a);
        var bVal = property.GetValue(b);
        if (aVal as System.Collections.IEnumerable != null)
        {
        // Convert into lists, do something with SequenceEqual and possibly recursive call to IsEqual
        }

        if (!Equals(aVal,bVal)) return false;
    }
    return true;
}

我不确定如何将给定的成员变量转换为正确的列表,因此我可以对它进行SequenceEqual来比较列表。

我将在IsEqual()中使用的类不是我的程序固有的,而是来自DLL。

1 个答案:

答案 0 :(得分:0)

以下代码对您有用吗?

public static bool DeepEquals(object a, object b)
{
    if (a == null)
    {
        if (b == null) return true;
        else return false;
    }
    else if (b == null) return false;

    if (object.ReferenceEquals(a, b)) return true;

    var comparable = a as IComparable;
    if (comparable != null)
    {
        return comparable.CompareTo(b) == 0;
    }

    var aType = a.GetType();
    var bType = b.GetType();
    if (aType != bType) return false;

    var aEnumerable = a as IEnumerable;
    if (aEnumerable != null)
    {
        var bEnumerable = (IEnumerable)b;
        var aEnumerator = aEnumerable.GetEnumerator();
        var bEnumerator = bEnumerable.GetEnumerator();
        while (true)
        {
            var amoved = aEnumerator.MoveNext();
            var bmoved = bEnumerator.MoveNext();
            if (amoved != bmoved) return false;
            if (amoved == false && bmoved == false) return true;
            if (DeepEquals(aEnumerator.Current, bEnumerator.Current) == false) return false;
        }
    }

    var props = aType.GetProperties();
    foreach (var prop in props)
    {
        if (DeepEquals(prop.GetValue(a), prop.GetValue(b)) == false) return false;
    }
    return true;
}

请注意,此方法不是通用的。实现通用方法比较困难,因为在运行时您不知道属性的类型也不知道集合项的类型。