假设我有一个表示域对象的接口:
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
包含ColumnChanging
和ColumnChanged
个事件,但我不知道如何订阅它们。没有类似于Linq到Sql的OnCreated
部分方法,我不知道另一种方法来挂钩生成的构造函数。
答案 0 :(得分: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;
}
}
并使用这个新工厂,无论你在哪里使用旧工厂......