VB.NETまたはC#で、クラスが拡張メソッドで拡張されているかどうかを判断する方法はありますか?
3 に答える
編集:質問が拡張メソッドを参照するように変更されました(OPの意図である場合とそうでない場合があります)-いいえ、静的クラスでない限り、型が拡張メソッドのターゲットであるかどうかはわかりません(この場合関連するすべての潜在的なアセンブリを知らない限り、そのように使用することはできません)。
拡張メソッドは、属性で装飾された、静的な非ジェネリックトップレベル型の静的メソッドです。あなたはそのような方法が存在するかどうかを効果的に尋ねています。気になるすべてのアセンブリのすべてのメソッドを繰り返し処理して、そのタイプを対象とする拡張メソッドを見つけようとすることができますが、それだけです。
質問が拡張メソッドについて言及していなかったときの元の回答
拡張される可能性のあるすべてのアセンブリがわかっている場合は、とを使用Assembly.GetTypes
して各アセンブリを確認できますType.IsSubclassOf
。
クラスが封印されておらず、内部抽象メンバーが含まれていない場合(つまり、拡張可能である場合)、他のアンロードされたアセンブリにサブクラスが含まれているかどうかはわかりません。各クラスはその親について「知っています」が、その子については知りません。
クラスが保護されている、または公開されている場合、実際には、クラスが拡張されているかどうかを判断する方法はありません。
アセンブリ内、またはプロセス内(ロードされたすべてのアセンブリ)を判別する場合は、、Type.IsSubclassOf
またはを使用して確認できますType.IsAssignableForm
。
ソリューション内で(実際に実行せずに)コンパイル時に決定する場合は、コンストラクターをプライベートにするか、クラスを封印済みとしてマークし、ソリューションをコンパイルして、関連するすべてのエラーを確認します。完了したら、変更を元に戻します。
クラスが拡張メソッドで拡張されているかどうかを知ることはできません。拡張メソッドは、プロジェクトごとに弱く、異なる方法でのみクラスにアタッチされる静的プロシージャと考えてください。
拡張メソッドは新しい型を作成せず、正規のメンバーメソッドをオーバーライドすることはできません(したがって、直接呼び出しを開始するまで、オブジェクトの動作を変更することはできません)。したがって、それらの存在を検出する必要がない可能性があります。
特定のメソッドが拡張メソッドであるか、正規メンバーメソッドであるかを判別することができます。リフレクションを使用して、特定のロードされたアセンブリ内のすべての拡張メソッドを一覧表示することもできます。これはここで説明されています。