2006年08月23日

C#のパーシャルクラスとデザイナが生成したコードについて考えてみる

  
以前「TableAdapter で Command のタイムアウトを設定するには」で、TableAdapterの数だけ、CommandTimeoutプロパティを書かないといけない。と書いたが、再度、考えてみた。
partila Class MyClass {
...
}

というデザイナーが作成したコードがあった場合、ユーザが記述する、パーシャルクラスのほうで、継承元のクラスを指定することが可能だ。
なので、自分が記述するクラスでは、
partila Class MyClass : BaseClass {
...
}

と書けば、MyClass は、BaseClass から派生させることが可能。

でも、TableAdapterは、System.ComponentModel.Component から派生しているのでだめだ。

委譲も 同様の理由でだめ。
以下のように、各TableAdapterが、TableAdapter という基本クラスから派生していれば、もう少しやりようがあるのにな...
 public partial class TableAdapter : System.ComponentModel.Component { 
protected System.Data.SqlClient.SqlDataAdapter _adapter;
protected System.Data.SqlClient.SqlConnection _connection;
protected System.Data.SqlClient.SqlCommand[] _commandCollection;
protected bool _clearBeforeFill;
....
}

public partial class MyTableAdapter : TableAdapter {
...
}

こうなっていれば、
 public partial class TableAdapter { 
public int CommandTimeout {
get {
return ( this._commandCollection[0].CommandTimeout );
}
set {
for ( int i = 0; i < this.CommandCollection.Length; i++ ) {
if ( ( this.CommandCollection[i] != null ) ) {
( (System.Data.SqlClient.SqlCommand)
( this.CommandCollection[i] ) ).CommandTimeout = value;
}
}
}
}
...
}

と書ける。これで、すべてのTableAdapterに有効なプロパティを書けるので、拡張が簡単だ。
ただ、むやみやたらに、TableAdapter に拡張機能を入れられると、TableAdapterが
汚されてしまう危険もあるので、このようなクラス構造は、難しいところではある。

リフレクションを使って、無理やり重複をなくすこともできるが、そこまでしてやりたくもない。結局、良い解決策が見つからない。

スニペットで雛形を登録しておくのが最も現実的な解決策かな。


この記事へのコメント
はじめまして。気になる内容だったのでコメントします。
やっぱり同じようなことを考えますよね。
こちらで一つの例が挙げられています。
http://blogs.wankuma.com/mnow/archive/2006/08/24/37024.aspx

私のところでも何とか自動化できないかあがいてみました。
http://blogs.wankuma.com/kokuryu/archive/2006/08/26/37071.aspx

あまり参考にならないとは思いますが・・・。
Posted by 黒龍 at 2006年08月29日 19:30
コメントありがとうございます。
おおっ、えムナウ さんのページじゃないですか。
コードの自動生成と、ジェネリックを使ったFactoryクラスですね。
今、読む時間がないので、あとでじっくり読ませていただきます。
Posted by Gushwell at 2006年08月29日 23:39
ふるい記事にすみません。
TableAdapterってデザイナで基底クラスを指定できますよ。
Posted by なちゃ at 2007年01月17日 16:28
ああ、ほんとだ。
System.ComponentModel.Component
から、派生させたスーパークラスを作って、そのクラスを、プロパティに
設定すれば、良いんですね。
有用な情報どうもありがとうございました。

TableAdapterって、.NET Framework の外側にある機能なので、.NET Frameworkのドキュメントには記載されていないし、突っ込んだ情報が少ないんですよね。
Posted by Gushwell at 2007年01月18日 09:22
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/50567053