クラスのプロパティを比較して、変更されたクラスを特定します

WAQ

私のWebアプリケーションでは、UIを介して特定のものが変更されたときにユーザーに通知したいと思います。たとえば、私のプロジェクトクラスは次のようになります

public class Project
    {
        public string Name { get; set; }
        public TaskStatus Status { get; set; }
        public string Planner { get; set; }
        public DateTime ScheduleStart { get; set; }
        public DateTime ScheduleEnd { get; set; }
        public double EstimatedCost { get; set; }
        public double ActualCost { get; set; }
        public string AssignedTo { get; set; }
    }

これで、この情報がUIに表示され、特定のもの(ステータス、スケジュール、コストなど)を変更する権限を持つ特定のユーザーがこの情報を変更できます。だから私が欲しいのは、ユーザーが何かを変更したときに、プロジェクトマネージャーに通知するために電子メールを送信する必要があるということです。

メールの送信や権限の管理などに必要な他のすべてのコードを記述しました。たとえば、Plannerのみが変更された場合、またはステータスが変更された場合、TFSが通知を生成するように、メールには新旧の値が含まれている必要があります。

PS:上記のコードは、私のProjectクラスの非常に単純なバージョンを示しています。実際のクラスには、30を超える属性があります。そのため、個々のプロパティを比較するのではなく、どのプロパティが変更されたかを通知するためのより簡単で一般的な方法が必要だと考えていました。

ザナトス

リフレクションに基づくシンプルなソリューション。最適化でき、(現時点では)内部コレクション/オブジェクトの比較をサポートしていないことに注意してください。比較されるオブジェクトはPOD(Plain Old Data)である必要があります

public class Project
{
    public string Name { get; set; }
    public TaskStatus Status { get; set; }
    public string Planner { get; set; }
    public DateTime ScheduleStart { get; set; }
    public DateTime ScheduleEnd { get; set; }
    public double EstimatedCost { get; set; }
    public double ActualCost { get; set; }
    public string AssignedTo { get; set; }

    public Project Clone()
    {
        // If your object has inner collections, or
        // references to other objects, you'll have to deep
        // clone them ***manually***!!!
        return (Project)MemberwiseClone();
    }
}

public static class SimpleComparer
{
    // Item1: property name, Item2 current, Item3 original
    public static List<Tuple<string, object, object>> Differences<T>(T current, T original)
    {
        var diffs = new List<Tuple<string, object, object>>();

        MethodInfo areEqualMethod = typeof(SimpleComparer).GetMethod("AreEqual", BindingFlags.Static | BindingFlags.NonPublic);

        foreach (PropertyInfo prop in typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public))
        {
            object x = prop.GetValue(current);
            object y = prop.GetValue(original);
            bool areEqual = (bool)areEqualMethod.MakeGenericMethod(prop.PropertyType).Invoke(null, new object[] { x, y });

            if (!areEqual)
            {
                diffs.Add(Tuple.Create(prop.Name, x, y));
            }
        }

        return diffs;
    }

    private static bool AreEqual<T>(T x, T y)
    {
        return EqualityComparer<T>.Default.Equals(x, y);
    }
}

ここで、Clone()メソッドが必要になります

public class Project
{
    public string Name { get; set; }
    public TaskStatus Status { get; set; }
    public string Planner { get; set; }
    public DateTime ScheduleStart { get; set; }
    public DateTime ScheduleEnd { get; set; }
    public double EstimatedCost { get; set; }
    public double ActualCost { get; set; }
    public string AssignedTo { get; set; }

    public Project Clone()
    {
        // If your object has inner collections, you'll have to deep
        // clone them ***manually***!!!
        return (Project)MemberwiseClone();
    }
}

その後...

var current = new Project();
var original = current.Clone();
current.ActualCost = 10000;

var diffs = SimpleComparer.Differences(current, original);

foreach (var diff in diffs)
{
    Console.WriteLine("'{0}' changed from {1} to {2}", diff.Item1, diff.Item3, diff.Item2);
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

MVVMで変更されたプロパティを介して別のクラスのプロパティを変更しますか?

分類Dev

オブジェクトの2つのリストを比較して、特定のプロパティで新規、変更、更新されたものを探します

分類Dev

jqueryを使用してパディングをクラスに変更しますが、クリックされたアイテムのみに変更します

分類Dev

特定のネストされたプロパティをクラスに逆シリアル化します

分類Dev

新しい継承されたクラスは、EF CodeFirstを使用した移行時にプロパティ名の名前が変更されます

分類Dev

渡されたパラメータに基づいてクラスプロパティ値を変更します

分類Dev

監視可能なコレクション内のアイテムが変更されたときに、現在のクラスプロパティを更新します

分類Dev

派生クラスのプロパティのxml記述を変更します

分類Dev

Angular:疑似クラスのSCSSプロパティを動的に変更します

分類Dev

JavaScriptクラスプロパティの変更を検出しますか?

分類Dev

Angular2タイプスクリプトが機能しないイベントによって呼び出されたメソッドを介してクラス変数値またはクラスプロパティ値を変更する

分類Dev

jQueryで!importantを使用してfullcalendarのcssクラスプロパティを変更します

分類Dev

Ouput(GraphVizの場合)プライベート変数を持つクラスをバンドルされたプロパティとして使用して、グラフの頂点をそのプロパティでブーストします

分類Dev

クラスプロパティ内のオブジェクト内のvuev2値は変更されましたが、変更されていません

分類Dev

プロパティのタイプを子クラスのサブクラスに変更します

分類Dev

LINQを使用したクラスのプロパティによって区別されます

分類Dev

Vue js:計算されたプロパティを使用して文字列を変更し、CSSクラスとして動的に適用する方法

分類Dev

ObservableCollectionアイテムのプロパティのサブスクライブが変更されました-WPF

分類Dev

計算されたプロパティルックアップは、クラス/サブタイプを変更しているようです

分類Dev

渡されたクラスのプロパティをパラメータJavaに取得します。

分類Dev

子クラスの読み取り専用プロパティを親クラスから変更します

分類Dev

ロードされた画像のクラスの幅と高さのプロパティを設定します

分類Dev

Jacksonライブラリを使用して派生クラスのJSONプロパティ名を変更する

分類Dev

HTMLクラスの変更を監視してinnerHTMLプロパティを変更する方法

分類Dev

カスタムの子プロパティを変更しても、親クラスのコントロールは更新されません

分類Dev

プロパティ変更通知に適したクラスを作成する

分類Dev

JavaScriptを使用してCSSプロパティを変更します。(IDとクラスを使用)

分類Dev

クラスに特定のプロパティが含まれているかどうかを検索します

分類Dev

マップされたオブジェクトとバインドし、プロパティの変更をサブスクライブするKnockout.js

Related 関連記事

  1. 1

    MVVMで変更されたプロパティを介して別のクラスのプロパティを変更しますか?

  2. 2

    オブジェクトの2つのリストを比較して、特定のプロパティで新規、変更、更新されたものを探します

  3. 3

    jqueryを使用してパディングをクラスに変更しますが、クリックされたアイテムのみに変更します

  4. 4

    特定のネストされたプロパティをクラスに逆シリアル化します

  5. 5

    新しい継承されたクラスは、EF CodeFirstを使用した移行時にプロパティ名の名前が変更されます

  6. 6

    渡されたパラメータに基づいてクラスプロパティ値を変更します

  7. 7

    監視可能なコレクション内のアイテムが変更されたときに、現在のクラスプロパティを更新します

  8. 8

    派生クラスのプロパティのxml記述を変更します

  9. 9

    Angular:疑似クラスのSCSSプロパティを動的に変更します

  10. 10

    JavaScriptクラスプロパティの変更を検出しますか?

  11. 11

    Angular2タイプスクリプトが機能しないイベントによって呼び出されたメソッドを介してクラス変数値またはクラスプロパティ値を変更する

  12. 12

    jQueryで!importantを使用してfullcalendarのcssクラスプロパティを変更します

  13. 13

    Ouput(GraphVizの場合)プライベート変数を持つクラスをバンドルされたプロパティとして使用して、グラフの頂点をそのプロパティでブーストします

  14. 14

    クラスプロパティ内のオブジェクト内のvuev2値は変更されましたが、変更されていません

  15. 15

    プロパティのタイプを子クラスのサブクラスに変更します

  16. 16

    LINQを使用したクラスのプロパティによって区別されます

  17. 17

    Vue js:計算されたプロパティを使用して文字列を変更し、CSSクラスとして動的に適用する方法

  18. 18

    ObservableCollectionアイテムのプロパティのサブスクライブが変更されました-WPF

  19. 19

    計算されたプロパティルックアップは、クラス/サブタイプを変更しているようです

  20. 20

    渡されたクラスのプロパティをパラメータJavaに取得します。

  21. 21

    子クラスの読み取り専用プロパティを親クラスから変更します

  22. 22

    ロードされた画像のクラスの幅と高さのプロパティを設定します

  23. 23

    Jacksonライブラリを使用して派生クラスのJSONプロパティ名を変更する

  24. 24

    HTMLクラスの変更を監視してinnerHTMLプロパティを変更する方法

  25. 25

    カスタムの子プロパティを変更しても、親クラスのコントロールは更新されません

  26. 26

    プロパティ変更通知に適したクラスを作成する

  27. 27

    JavaScriptを使用してCSSプロパティを変更します。(IDとクラスを使用)

  28. 28

    クラスに特定のプロパティが含まれているかどうかを検索します

  29. 29

    マップされたオブジェクトとバインドし、プロパティの変更をサブスクライブするKnockout.js

ホットタグ

アーカイブ