ジェネリックかキャストか

 プラグインのインターフェースはギリギリまで絞ることが多い。プラグインへの入力に使う型はインターフェースよりも大きい場合がある。他のプラグインでも使えるように複数のプラグインのインターフェースを実装したデータ型なんかはプラグインのインターフェースよりも大きくなる。

 入力に使った型がそのままプラグインから返ってくることがある。返ってくるときにはプラグインのインターフェースの型にまで小さくなってしまっている。それを他のプラグインに入れるために、元の型にキャストするか、あるいは最初からジェネリックにしてしまうか。

 こういうのは常にジェネリックにしたほうがいい。しかしジェネリックを一個でも作ると関連する型全てに<>の括弧をくっつけなきゃいけなくなり、可読性が著しく下がる。何より書くのがめんどい。

 可読性を下げずにジェネリックを使うには、C#だと一つのアセンブリの型全てを一つのパーシャルクラスの中につっこみ、パーシャルクラスをジェネリックにして型情報を与えてやるといい。これで<>は一番上部のパーシャルクラスにまとまる。

 他のアセンブリから使うときに型名が長くなってしまう。パーシャルクラスはアセンブリをまたがって一つにまとめることは出来ない。プラグインのインターフェースを実装するアセンブリの場合は、インターフェースのアセンブリのパーシャルクラスを継承したパーシャルクラスを作ってその中に全部の型を入れれば、インターフェースのアセンブリの名前は全部そのまま使える。

 複数のインターフェースアセンブリを参照するアセンブリの場合は、継承したパーシャルクラスの内部に継承したパーシャルクラスの内部に継承したパーシャルクラス・・・とやってもいいのだが、インデントが深くなって困ったことになるので、素直にusingしたらいいんじゃなかろうか。しかしusingだと<>内に入れる不定な型情報が使えないんだよなあ。具体型が分かってりゃいいんだけど。