3

重複の可能性:
文字列をフォーマットするための拡張メソッドを作成することは可能ですか?

私はこのクラスを持っています:

public class Person 
{
    public string Name { get; set; }
    public uint Age { get; set; }

    public override string ToString()
    {
        return String.Format("({0}, {1})", Name, Age);
    }
}

拡張メソッド:

public static string Format(this string source, params object[] args)
{
    return String.Format(source, args);
}

そして私はそれをテストしたいのですが、私は次の奇妙な振る舞いをしています:

Person p = new Person() { Name = "Mary", Age = 24 };

// The following works
Console.WriteLine("Person: {0}".Format(p));
Console.WriteLine("Age: {0}".Format(p.Age));

// But this gives me a compiler error:
Console.WriteLine("Name: {0}".Format(p.Name));

コンパイラエラー:

インスタンスへの参照を使用してメンバー'string.Format(string、params object [])'にアクセスできません。タイプ名で修飾します。

なんで?どうすればこの問題を解決できますか?

4

2 に答える 2

1

既存のメソッド( String.Format )と同じシグネチャを使用して拡張メソッドを作成しました。拡張メソッドには別の名前を使用する必要があります。代わりにFormatWith(...)のようなもの。

私は正直に立っています。この動作を検証するために単体テストをまとめたところ、「文字列」を呼び出すことができませんでした。Format(...)。C#では、コンパイラは「非静的コンテキストで静的メソッド'Format'にアクセスできません」と表示します。これを考えると、コンパイラを混乱させることができたと思います。

于 2012-10-23T17:03:17.807 に答える
1

は文字列であるためp.Name、3番目のシナリオではあいまいな呼び出しがあります。

string.Format(string)

対。

{string instance}.Format(object[]);

リゾルバーは、拡張メソッドよりもシグネチャに最適なメソッド(この場合はastringとan )を選択します。object[]

この問題を解決するには、extensionメソッドの名前を変更するか、2番目のパラメーターをオブジェクトにキャストして、リゾルバーが静的メソッドを選択しないようにします。

Console.WriteLine("Name: {0}".Format((object)p.Name));
于 2012-10-23T17:22:49.877 に答える