個別のDLLの部分クラス


154

別のDLLの部分クラスに2つの部分(同じ名前空間、同じクラス名)を持つことは可能ですか?


他の人は不可能だと言ったように、異なるソースからの新しい動作でクラスを補足する方法があります。異なるDLLで正確に何をしたいですか?
Ozan 2010年

私の場合、サードパーティのライブラリで定義されているクラスにいくつかの静的メソッドを追加したいと思います。クラスは静的であるため、拡張メソッドは機能せず、インターフェースと継承も機能しません。部分的な静的クラスを持つことができることを発見した後、アセンブリ全体で機能するかどうかを確認するためにここに来ましたが、悲しいかな、これも機能しないようです。
ベン

回答:


232

MSDNから- 部分クラスとメソッド

同じタイプのパーツであることを意図したすべての部分タイプ定義は、同じアセンブリと同じモジュール(.exeまたは.dllファイル)で定義する必要があります。部分的な定義は、複数のモジュールにまたがることはできません。


36

いいえ。部分クラスは純粋に言語機能です。アセンブリがコンパイルされると、ファイルが結合されてタイプが作成されます。ファイルを別のアセンブリに分散することはできません。

ただし、何をしたいかによっては、拡張メソッドを使用して必要なことを実行できる場合があります。



8

他の回答は、このページにアクセスした人が見たり聞いたりしたくないという不快な「いいえ」を提供しますが、ここではまだ触れられていない別の考えに感動しました。部分的なクラスがアセンブリ全体で許可された場合、彼が作成していない既存の型のプライベートメンバーにアクセスできるため、元の作成者が意図していない方法でそれらを操作できるため、継承するすべてのクラスの機能が危険にさらされます。あまりにも。

それだけでなく、他のアセンブリ(およびその子)のクラスは、機能させるために再コンパイルする必要があります。したがって、クラスをさまざまなアセンブリに分割することは論理的に不可能です。


本当に必要な場合は、リフレクションを介してプライベートメンバーを簡単に操作できます。循環参照は許可されておらず、クラスの異なる部分が相互作用するために参照が必要になるため、アセンブリ間でクラスを分割することはできません。
Zar

6

別のdllのクラスにメソッドを追加する場合は、拡張メソッドを使用できます。このメソッドの1つの欠点は、静的メソッドを追加できないことです。


3

問題は、なぜ別のアセンブリで部分クラスを作成するのかということです。アセンブリ全体で抽象クラスとインターフェイスを定義できます。おそらく、それを調べる必要があります。


10
たとえば、別のアセンブリで定義されたモデルクラスにMVCフォームアノテーションを追加することができます。アセンブリ自体はそれがどのコンテキストで使用されているかを認識していないため、アセンブリ内のクラスには注釈を付けないでください。ただし、MVCコンテキストの部分クラスに追加できます(可能な場合)。
nyi 14年

3
nyi、なぜそのクラスから継承して属性を最上位に宣言しないのですか?必要に応じて、同じ名前で呼び出すこともできます。
グレノ2014年

0

おそらく、自分のライブラリ内で、第3部ライブラリのクラスの周りにWrapperクラスを作成したいだけです。次に、ラッパークラスに機能を追加します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.