private static Variance DictionaryCompare <TSubTypeKey, TSubTypeValue>(Dictionary <TSubTypeKey, TSubTypeValue> set1, Dictionary <TSubTypeKey, TSubTypeValue> set2, string fieldName)
    {
        var variance = new Variance.EnumerableVariance();

        foreach (var key in set1.Keys)
        {
            var subVariance = !set2.ContainsKey(key)
                                    ?   new Variance.KeyedObjectRemovedVariance <TSubTypeKey>()
            {
                Prop = fieldName, key = key
            }
                                    :   set1[key].DetailedCompare(set2[key], fieldName + "[" + key.ToString() + "]");
            if (subVariance != null)
            {
                variance.variances.Add(subVariance);
            }
        }
        foreach (var key in set2.Keys)
        {
            if (!set1.ContainsKey(key))
            {
                variance.variances.Add(new Variance.KeyedObjectRemovedVariance <TSubTypeKey>()
                {
                    Prop = fieldName, key = key
                });
            }
        }
        return(variance);
    }
    private static Variance typedHomogeneousValueEnumerableCompare <T, TSubType>(T val1, T val2, string fieldName)
    {
        var variance = new Variance.EnumerableVariance();
        var list1    = ((IEnumerable <TSubType>)val1).ToList();
        var list2    = ((IEnumerable <TSubType>)val1).ToList();

        foreach (var item in list1)
        {
            if (!list2.Contains(item))
            {
                variance.variances.Add(new Variance.ValueRemovedVariance <TSubType>()
                {
                    Prop = fieldName, value = item
                });
            }
        }
        foreach (var item in list2)
        {
            if (!list1.Contains(item))
            {
                variance.variances.Add(new Variance.ValueAddedVariance <TSubType>()
                {
                    Prop = fieldName, value = item
                });
            }
        }
        return(variance);
    }
    private static Variance objectCompare <T>(T val1, T val2, string fieldName)
    {
        var variance = new Variance.EnumerableVariance()
        {
            Prop = fieldName
        };
        List <FieldInfo> fi = val1.GetType().GetRuntimeFields().ToList <FieldInfo>();

        foreach (FieldInfo f in fi)
        {
            var subVariance = f.GetValue(val1).DetailedCompare(f.GetValue(val2), f.Name);
            if (subVariance != null)
            {
                variance.variances.Add(subVariance);
            }
        }
        return(variance);
    }