0

MyEntityBase自動生成されたDataContextクラスMyContext. モック データ コンテキストを作成しようとして、一般的に変更を追跡できるように実装INotifyPropertyChangedすることにしました。MyEntityBase

私のクラスは次のようになります。

public abstract class MyEntityBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
}

このクラスに基づいてRepository<T>、特定の種類のエンティティのインスタンスを格納するためのジェネリック クラスを作成しました。このクラスの背後にある基本的な考え方は、datacontext に似たメソッドを提供することですが、代わりにメモリ内リストに支えられています。また、サードパーティ システムと同期するためのアプリケーションのビジネス ロジックにとって、変更セットは重要であるため、変更の追跡をシミュレートしたいと考えています。

の基本的なシェル実装を次に示しますRepository<T>

public class Repository<T>
    where T : MyEntityBase, INotifyPropertyChanged
{
    protected List<T> _data;
    public Repository(List<T> data)
    {
        this._data = data;
        foreach (var entity in this._data)
        {
            entity.PropertyChanged += new PropertyChangedEventHandler(entity_PropertyChanged);
        }
    }

    protected void entity_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        Console.WriteLine("HERE");
    }
}

次に、タイプ の単純なリポジトリを作成し、Employeeいくつかのデータを入力して、データのプロパティを変更しようとします。オブジェクトには自動生成された からのプロパティ変更通知が組み込まれているため、PropertyChangedイベントが発生すると予想されます。ただし、次のコードを実行すると、出力に生成されたものがどこにも表示されません。EmployeeDataContextHERE

var data = new List<Employee> {
    new Employee { FirstName = "Bob" },
    new Employee { FirstName = "Joe" },
};

var repo = new Repository<Employee>(data);

// This should fire the PropertyChanged event
data[0].FirstName = "John";

私は何を間違っていますか?


更新: イベントをサブスクライブする行を次のように変更すると:

(entity as Employee).PropertyChanged += ...

その後、正常に動作します。しかし、Tは既に既知でEmployeeありentity、 type のインスタンスであるEmployeeため、違いは何ですか? eventを に設定しMyEntityBaseても、virtual正しく動作しません。

4

1 に答える 1

0

実行可能なソリューションが実装されているので、自分の質問に答えます。FindAndReplaceText.exe自動生成されたファイルをカスタマイズするために使用するコマンド ライン ツールが既にあるのでMyDataContext.dbml、最後に別の呼び出しを追加して、生成されたMyDataContextクラスのすべてのイベントを includeに変更しますoverride。イベントの定義で基本クラスを使用することと相まってvirtual、これは問題を解決します。

FindAndReplaceText.exe -c ^
    MyDataContext.cs ^
    "public event" ^
    "public override event"

これで、プロパティの変更がテスト コードで適切に通知されるようになりました。

于 2012-04-10T19:17:58.217 に答える