1

假设我有一个表示域对象的接口:

public interface IFoo
{
    Bar Bar { get; }
}

Bar类型是一系列对象,每个对象都有一个稍微不同的模式。在数据库中,这表示为 XML(这是一个移动应用程序,所以它只是nvarchar而不是真正的 XML 列)。

我有一个生成DataSet的包含一个FooDataTable和相应的FooRow对象:

// AcmeDataSet.designer.cs

public partial class FooRow : DataRow
{
    public string BarXml
    {
        // Generated get and set
    }
}

我想实现IFoo和缓存的反序列化实例Bar

// FooRow.cs

public partial class FooRow : IFoo
{
    private Bar _bar;

    Bar IFoo.Bar
    {
        get { return _bar; }
    }
}

我如何才能从部分类中确定 的值BarXml已更改?

我意识到FooDataTable包含ColumnChangingColumnChanged事件,但我不知道如何订阅它们。Linq to Sql 的部分方法没有类似物OnCreated,我不知道另一种方法可以挂接到生成的构造函数中。

4

1 回答 1

3

如果我理解正确,那么您的 FooRow 对象(实例)是从 Type DataRow 派生的某种类型的实例......如果是这样,那么由于 DataRow 具有引用 DataTable 的属性,只需将您的 IFoo 变量转换为 DataRow ,

FooRow 内部

  public partial class FooRow
  {    
       private void myColumnChanging Handler(object sender, EventArgs e)
       {
            // Implementation
       }
       private void myColumnChanged Handler(object sender, EventArgs e)
       {
            // Implementation
       }
       public void RegisterEvents()
       {
          ((DataRow)this).Table.ColumnChanging += myColumnChanging; 
          ((DataRow)this).Table.ColumnChanged += myColumnChanged; 
       }
   }

然后,在 FooDataTable 类中,添加一个新的工厂方法 MyNewFooRow()

public class FooDataTable 
{
    //  -- Other implementation
    public FooRow MyNewFooRow()
    {
        FooRow fr = this.NewFooRow(); // call the original factory
        fr.RegisterEvents();
        return fr;
    }
 }

并在您使用旧工厂的任何地方使用这个新工厂...

于 2008-12-01T19:54:40.453 回答