1

私のクライアントは、プロジェクト コードで .ToString() を呼び出すたびに、カスタマイズされた操作 (db に行を追加するなど) を行う必要があるという奇妙な要件を思いつきました。

オーバーライド機能を提供してくれるなら、拡張メソッドは私にとって非常に役立つと感じました。

Microsoft が、クラス メソッドの既存の動作をオーバーライドする拡張メソッドを許可しなかった理由は何ですか?

コンパイラは拡張メソッドをクラスメソッドよりも優先度が低いと聞いています。クラスメソッドよりも拡張メソッドを優先するようにコンパイラを変更する方法はありますか?

4

2 に答える 2

7

クラスメソッドよりも拡張メソッドを優先するようにコンパイラを変更する方法はありますか?

いいえ、できません。

同様の質問から Eric Lippert を引用します。

拡張メソッドの目的は、型で使用可能なメソッドのセットを拡張することであり、既存のメソッドをオーバーライドすることではありません。それが「拡張メソッド」と呼ばれる理由です。

MSDNから- 拡張方法:

拡張メソッドを使用してクラスまたはインターフェースを拡張できますが、それらをオーバーライドすることはできません。インターフェイスまたはクラス メソッドと同じ名前とシグネチャを持つ拡張メソッドは呼び出されません。

于 2013-02-14T07:14:58.317 に答える
1

実は拡張機能自体に問題があります。インスタンスの ToString() メソッドは拡張より優先されるためです。

Microsoft Developer Network に適切な説明があります。

要するに:

class Program
{
    static void Main(string[] args)
    {
        try
        {
            string value = "test";
            Console.WriteLine(value.ToString());
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }
        Console.WriteLine("End");
        Console.Read();
    }
}
public static class StaticExtensions
{
    public static string ToString(this Object obj)
    {
        if (obj == null)
            return "";
        else
            return obj.GetType().FullName + obj.ToString() ;
    }
}

テストを返します。

おそらく別の方法を試す必要があります。おそらくプロキシオブジェクトか、その方向の何か。

于 2013-02-14T07:35:50.007 に答える