2012-04-10 82 views
0

我为自动生成的DataContextMyContext中类型的超类设置了一个名为MyEntityBase的自定义基类型。在尝试创建模拟数据上下文时,我决定在MyEntityBase上实现INotifyPropertyChanged,以便我可以一般地跟踪更改。自定义DataContext上的INotifyPropertyChanged基类型不会触发

这里是我的课是什么样子:

public abstract class MyEntityBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
} 
基于这一类

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

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

现在我创建Employee类型的简单库,填充一些数据,并试图修改数据的属性。由于Employee对象具有自动生成的DataContext内置的属性更改通知,因此我预计PropertyChanged事件会上升。然而,当我运行下面的代码,我没有看到任何地方输出产生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已知为EmployeeentityEmployee类型的实例,所以有什么区别?即使我将MyEntityBase中的event设置为virtual,它仍然无法正常工作。

+1

我在这里复制你的代码http://dotnetpad.net/ViewPaste/HfGdC7ypCEC4TYZ-Vb7I0A(并且添加虚拟到实体)。这似乎工作..也许有什么在员工搞乱它? – Patrick 2012-04-10 18:02:02

+0

嗯,我不能控制'Employee',因为它是使用'SQLMetal'自动生成的。但看起来不同的是缺少'override'关键字,并且删除它会导致它在测试代码上再次失败。 – mellamokb 2012-04-10 18:37:03

+0

所以它看起来像我需要一种方法来强制像Employee一样的继承类总是覆盖PropertyChanged,即使关键字'override'不存在。这样的事情甚至可能吗? – mellamokb 2012-04-10 18:53:30

回答

0

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

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

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

相关问题