107

クラス内のメソッドを拡張メソッドでオーバーライドしたい場合がありました。C#でそれを行う方法はありますか?

例えば:

public static class StringExtension
{
    public static int GetHashCode(this string inStr)
    {
        return MyHash(inStr);
    }
}

私がこれをやりたかったのは、文字列のハッシュをデータベースに保存し、文字列クラスのハッシュを使用するすべてのクラス (つまり、辞書など) で同じ値を使用できるようにすることです。組み込みの .NET ハッシュ アルゴリズムは、フレームワークのあるバージョンから次のバージョンへの互換性が保証されていないため、独自のものに置き換えたいと考えています。

クラスメソッドを拡張メソッドでオーバーライドしたい場合が他にもあるので、文字列クラスまたはGetHashCodeメソッドに固有のものではありません。

既存のクラスをサブクラス化することでこれを実行できることはわかっていますが、多くの場合、拡張機能を使用して実行できると便利です。

4

4 に答える 4

98

いいえ; 拡張メソッドは、適切なシグネチャを持つインスタンス メソッドよりも優先されることはなく、ポリモーフィズム ( GetHashCodeis a virtualmethod) に参加することもありません。

于 2009-05-22T19:20:20.293 に答える
8

メソッドの署名が異なる場合は、それを行うことができます-つまり、あなたの場合:いいえ。

ただし、それ以外の場合は、探していることを行うために継承を使用する必要があります。

于 2009-05-22T19:20:46.347 に答える
2

私の知る限り、拡張メソッドはインスタンスではないため、答えはノーです。クラスのインスタンスを使用して静的メソッドを呼び出すことができるインテリセンス機能のようなものです。あなたの問題の解決策は、特定のメソッド(GetHashCode()など)の実行を傍受し、他の何かを行うインターセプターになると思います.そのようなインターセプター(Castle Projectが提供するものなど)を使用するには、すべてのオブジェクトをインスタンス化する必要があります.オブジェクト ファクトリ (または Castle の IoC コンテナー) を使用して、実行時に生成された動的プロキシを介してインターフェイスをインターセプトできるようにします (Caslte では、クラスの仮想メンバーをインターセプトすることもできます)。

于 2009-05-23T10:45:07.487 に答える