あなたが言ったように、拡張機能を仮想化するだけでは方法がありません。
静的メソッドを使用して仮想メソッド パターン全体を自分で実装することもできますが、実際には役に立たないだろうと強く感じています。関連する作業はこの単純なものには法外なものになるため、興味深い理論的解決策です。
可能なサブクラスの固定数が有限である場合、最初のメソッドに次のようなものを持たせることができます。
public static void HelperExtension(this A a)
{
B b = a as B;
if(b != null)
HelperExtension(b);
else
//the rest of the method.
}
Switch
多くのサブクラスがある場合は aまたはa を使用することもできますDictionary<Type, Action<A>>
が、面倒で、保守が難しく、コンパイル時に不明な任意の継承をサポートしません。
もう 1 つのオプションは、コンパイル時にコンパイラの機能を基本的に活用することですdynamic
。可能な限り回避することを強くお勧めしますが、この特定のケースでは、 に 1 つのパブリック拡張機能A
、各サブタイプの一連のプライベートな静的メソッド (異なる名前)、および 1 つのディスパッチ呼び出しを許可します。
public static void HelperExtension(this A a)
{
ExtenstionImplementation((dynamic)a);
}
private static void ExtenstionImplementation(A a){...}
private static void ExtenstionImplementation(B a){...}
private static void ExtenstionImplementation(C a){...}