0

我有一个自定义基类型,称为MyEntityBase自动生成的类中类型的超DataContext类,MyContext. 在尝试创建模拟数据上下文时,我决定实现INotifyPropertyChangedonMyEntityBase以便我可以一般地跟踪更改。

这是我的班级的样子:

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

基于这个类,我创建了一个通用Repository<T>类,用于存储特定类型实体的实例。此类背后的基本思想是提供类似于数据上下文的方法,但由内存中的列表支持。我还想模拟跟踪更改,因为更改集对于我们的应用程序的业务逻辑很重要,以便与第 3 方系统同步。

这是一个基本的shell实现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");
    }
}

现在我创建一个简单的 type 存储库Employee,填充一些数据,并尝试修改数据的属性。我希望该PropertyChanged事件被引发,因为该Employee对象具有来自自动生成的内置属性更改通知DataContext。但是,当我运行以下代码时,HERE在任何地方的输出中都看不到生成:

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它仍然无法正常工作。MyEntityBasevirtual

4

1 回答 1

0

我已经实施了一个可行的解决方案,所以我会回答我自己的问题。由于我已经有一个命令行工具FindAndReplaceText.exe用于对自动生成的MyDataContext.dbml文件进行一些自定义,因此我只是在最后添加了另一个调用,在该调用中我将生成的类中的所有事件修改MyDataContext为包含override. 再加上virtual在事件定义中使用我的基类,这解决了问题:

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

现在属性更改在我的测试代码中正确通知。

于 2012-04-10T19:17:58.217 回答