1
public static bool PropertiesEqual<T>(T self, T to, params string[] skip) 
where T : class
{
    if (self != null && to != null)
    {
        var selfType = self.GetType();

        var skipList = new List<string>(skip);
        foreach (PropertyInfo pi in selfType.GetProperties(BindingFlags.Public |
                                                         BindingFlags.Instance))
        {
            if (skipList.Contains(pi.Name)) continue;

            var selfValue = selfType.GetProperty(pi.Name).GetValue(self, null);
            var toValue = selfType.GetProperty(pi.Name).GetValue(to, null);

            if (selfValue != toValue && (selfValue == null ||
                                         !selfValue.Equals(toValue)))
            {
                return false;
            }
        }
            return true;
    }
    return self == to;
}

我想使用扩展方法扩展我的 EF 实体,该方法比较两个实例的原始(?)属性(属性,如数字、字符串、布尔值和未附加的对象)。

我想知道的是,是否可以将其作为扩展方法?还是我需要在 POCO 类中为我想要做的每种 EF 类型定义它instance1.PropertiesEqual(instance2)

我想知道的第二件事是如何正确定位我上面提到的数据类型,并跳过附加对象(连接表)。

4

1 回答 1

2

要回答您的第一个问题,您可以轻松地将其定义为扩展方法,只要该方法存在于静态类中即可。

其次,如果你检查Type.IsByRef你只会得到字符串和结构属性,它们都有 Object.Equals 的默认实现。

此外,此实现将在进行(昂贵的)属性比较之前检查 null 和相等性。

如果要加快速度,可以使用动态方法进行比较。

public static bool PropertiesEqual<T>(this T self, T other, params string[] skip)
{
    if (self == null) return other == null;
    if (self.Equals(other)) return true;

    var properties = from p in typeof(T).GetProperties()
                        where !skip.Contains(p.Name)
                        && !p.PropertyType.IsByRef // take only structs and string
                        select p;

    foreach (var p in properties)
    {
        var selfValue = p.GetValue(self);
        var otherValue = p.GetValue(other);
        if (!object.Equals(selfValue, otherValue))
            return false;
    }
    return true;
}
于 2013-11-12T12:07:56.157 回答