Обнаружение изменений DataRow в частичном классе - PullRequest
1 голос
/ 01 декабря 2008

Допустим, у меня есть интерфейс, представляющий объект домена:

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 события, но я не знаю, как подписаться на них. Нет аналога частичного метода OnCreated в Linq to Sql, и я не знаю другого способа подключиться к сгенерированному конструктору.

1 Ответ

3 голосов
/ 01 декабря 2008

Если я вас правильно понимаю, то ваш объект 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;
    }
 }

и используйте этот новый завод, где бы вы ни использовали старый ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...