C#.Net でプロトタイプ メソッド (JavaScript など) を作成するにはどうすればよいですか?
質問
C#.Net でプロトタイプ メソッドを作成するにはどうすればよいですか?
JavaScript では、次のようにして文字列オブジェクトの Trim メソッドを作成できます。
String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g,"");
}
C#.Net でこれを行うにはどうすればよいですか?
解決
.NET では、そのクラスのソースを変更する場合を除き、既存のオブジェクトまたはクラスにメソッドを動的に追加することはできません。
ただし、C# 3.0 では、拡張メソッドを使用できます。 見て 新しいメソッドと同様ですが、コンパイル時の魔法です。
コードでこれを行うには:
public static class StringExtensions
{
public static String trim(this String s)
{
return s.Trim();
}
}
使用するには:
String s = " Test ";
s = s.trim();
これは新しいメソッドのように見えますが、次のコードとまったく同じ方法でコンパイルされます。
String s = " Test ";
s = StringExtensions.trim(s);
いったい何を達成しようとしているのでしょうか?おそらく、あなたが望むことを行うためのより良い方法があるでしょうか?
他のヒント
C# の拡張メソッドについて話しているようですね。最初のパラメータの前に「this」キーワードを挿入することで、既存のクラスに機能を追加します。メソッドは静的クラス内の静的メソッドである必要があります。.NET の文字列にはすでに「Trim」メソッドがあるため、別の例を使用します。
public static class MyStringEtensions
{
public static bool ContainsMabster(this string s)
{
return s.Contains("Mabster");
}
}
これで、すべての文字列に非常に便利な ContainsMabster メソッドが追加され、次のように使用できます。
if ("Why hello there, Mabster!".ContainsMabster()) { /* ... */ }
インターフェイス (IList など) に拡張メソッドを追加することもできます。これは、そのインターフェイスを実装するクラスもその新しいメソッドを選択することを意味します。
拡張メソッド内 (最初の「this」パラメーターの後) で宣言した追加パラメーターはすべて、通常のパラメーターとして扱われます。
拡張メソッドを作成する必要があります。これには .NET 3.5 が必要です。メソッドは静的クラス内で静的である必要があります。メソッドの最初のパラメータには、署名の先頭に「this」を付ける必要があります。
public static string MyMethod(this string input)
{
// do things
}
その後、次のように呼び出すことができます
"asdfas".MyMethod();
3.5 コンパイラを使用すると、拡張メソッドを使用できます。
public static void Trim(this string s)
{
// implementation
}
このハックを含めることで、CLR 2.0 を対象としたプロジェクト (3.5 コンパイラ) でこれを使用できます。
namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)]
public sealed class ExtensionAttribute : Attribute
{
}
}