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;
}

2 つのインスタンスのプリミティブ (?) プロパティ (数値、文字列、ブール値、添付されていないオブジェクトなどのプロパティ) を比較する拡張メソッドを使用して、EF エンティティを拡張したいと考えています。

私が知りたいのは、これを拡張メソッドとして作成することは可能ですか? それとも、私がやりたいEFタイプごとにPOCOクラスでこれを定義する必要がありますinstance1.PropertiesEqual(instance2)か?

2 番目に知りたいことは、上記のデータ型のみを適切にターゲットにして、添付オブジェクト (接続されたテーブル) をスキップする方法です。

4

1 に答える 1

2

最初の質問に答えるために、メソッドが静的クラスに存在する限り、これを拡張メソッドとして簡単に定義できます。

次に、Type.IsByRef文字列と構造体のプロパティのみを取得することを確認すると、どちらも Object.Equals のデフォルト実装を持っています。

また、この実装は、(高価な) by プロパティ比較を行う前に、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 に答える