C#通用对象比较

时间:2014-08-26 07:14:03

标签: c# generics compare

这是将两个对象与用户定义属性进行比较的通用类,但它无法正常工作。

public class ObjectComparer<T> : IEqualityComparer<T>
{
    private string _propertyName;

    private string PropertyName
    {
        get { return _propertyName; }
        set
        {
            _propertyName = value;
            PropertyInfo = typeof(T).GetProperty(PropertyName);
        }
    }

    public ObjectComparer(string propertyName)
    {
        PropertyName = propertyName;
    }

    private PropertyInfo PropertyInfo { get; set; }

    public int GetHashCode(T type)
    {
        if (type== null)
        {
            return 0;
        }
        return PropertyInfo.GetHashCode();
    }

    public bool Equals(T obj1, T obj2)
    {
        if (ReferenceEquals(obj1, obj2))
        {
            return true;
        }
        if (ReferenceEquals(obj1, null) || ReferenceEquals(obj2, null))
        {
            return false;
        }
        return PropertyInfo.GetValue(obj1, null) == PropertyInfo.GetValue(obj2, null);
    }
}

问题1)type == null(值类型与null的可能比较)

问题2)在这个位置使用ReferenceEquals是否正确?

更新

&#34; Word和#34;类:

public class Word
{
    public string EnglishText { get; set; }
    public string LocalText { get; set; }
    public string EditedText { get; set; }
}

用法:

var except = Program.Localizer.DefaultLanguage.Words.Except(CurrentSelectedLanguage.Words, new ObjectComparer<Word>("EnglishText"));

基于&#34;英文名称&#34;的不同对象的数量;是不正确的。


下面是Class authentic和Modified。 特别感谢Sriram Sakthivel

public class ObjectComparer<T> : IEqualityComparer<T>
{
    private string _propertyName;

    private string PropertyName
    {
        get { return _propertyName; }
        set
        {
            _propertyName = value;
            PropertyInfo = typeof(T).GetProperty(PropertyName);
        }
    }

    public ObjectComparer(string propertyName)
    {
        PropertyName = propertyName;
    }

    private PropertyInfo PropertyInfo { get; set; }

    public int GetHashCode(T obj)
    {
        if (ReferenceEquals(obj, null))
        {
            return 0;
        }
        return PropertyInfo.GetHashCode();
    }

    public bool Equals(T obj1, T obj2)
    {
        if (ReferenceEquals(obj1, obj2))
        {
            return true;
        }
        if (ReferenceEquals(obj1, null) || ReferenceEquals(obj2, null))
        {
            return false;
        }
        return Equals(PropertyInfo.GetValue(obj1, null),
                             PropertyInfo.GetValue(obj2, null));
    }
}

1 个答案:

答案 0 :(得分:1)

您的GetHashCode错了。您正在调用PropertyInfo.GetHashCode它应该使用Property值。

public int GetHashCode(T obj)
{
    if (object.ReferenceEquals(obj, null))
    {
        return 0;
    }
    var value = PropertyInfo.GetValue(obj);
    return value == null ? 0 : value.GetHashCode();
}

此外,您可以使用object.ReferenceEquals

去除resharper中值类型与null 警告的可能比较

GetHashCode参数被命名为type,这具有误导性,因此我将其重命名为obj

更新

如果您需要使用值比较,则必须使用Object.Equals方法,而不是使用==类型的object运算符

public bool Equals(T obj1, T obj2)
{
    if (ReferenceEquals(obj1, obj2))
    {
        return true;
    }
    if (ReferenceEquals(obj1, null) || ReferenceEquals(obj2, null))
    {
        return false;
    }
    return object.Equals(PropertyInfo.GetValue(obj1, null), 
                         PropertyInfo.GetValue(obj2, null));
}