2

私は C# コードでString.Formatifをおそらくステートメント以外の何よりも使用しています。

string ask = String.Format("Continue using [{0}]?", value);

どのくらいの頻度で使用するかを考えるようになりました。

次に、そのための拡張メソッドを作成することがどれほど素晴らしいかを考えなければなりませんでした。

ask.Format("Continue using [{0}]?", value);

それで、私はString.Formatを見なければなりませんでした。それを呼び出す方法はたくさんあるので、多くのオーバーロードがあります。

うーん...それは物事を複雑にします。

名前空間に既に存在するオーバーロードに基づいて単純に構築する拡張メソッドを作成する簡単な方法はありますか?System.String

これが私が見たいものです:

public static class Extensions
{
  public static String Format(this String str, String formatText, /* What goes here? */)
  {
    return str.Format(formatText, /* Magic */);
  }
}

String.Formatオーバーロードのそれぞれに一致するようにオーバーロードを記述できると思いますが、それは必要ないかもしれません。

4

4 に答える 4

2

呼び出し文字列を変更したい。そんなことはできません。.Net の文字列は変更されない (不変) ため、新しい文字列を返す必要があります。C# から得られる最も近いものは、次のようなコードです。

string ask = $"Continue using [{value}]?";

参照によって拡張オブジェクトを渡すことができれば、元の文字列を変更することができます。残念ながら、C# はこれをサポートしていません。

興味深いのは、ILそれをサポートしており、VB.Net を使用して必要なメソッドを記述できることです。

<Extension()> _
Public Shared Sub Format(ByRef str As String, ByVal formatText As String, ByVal ParamArray args As Object())
    str = String.Format(formatText, args);
End Sub

残念ながら、これを VB.Net クラス ライブラリ プロジェクトに詰め込んだとしても、C# から呼び出すことはできません。C# では、ref参照によってパラメーターを使用して関数を呼び出すときに、呼び出しサイトでキーワードを使用する必要があるためです。拡張メソッドを使用したこれの構文はありません。

目的の構文と完全には一致しないが、それでもかなり良い結果が得られる回避策については、Mike Cole の回答を参照してください。

于 2013-05-17T14:58:58.067 に答える
1

あなたは近くにいましたが、params object[] argsパラメータだけが欠けていました:

public static class Extensions
{
  public static String Format(this String str, 
                              String formatText, 
                              params object[] args)
  {
    return str.Format(formatText, args);
  }
}
于 2013-05-17T14:56:31.000 に答える