2017-05-03 2 views
3

私の知る限りでは、Cは#だけで、私たちはクラスのインスタンスで拡張メソッドを使用してみましょう:C#拡張メソッドは、クラスのインスタンスでのみ動作します。それのまわりで何か?

public class MyClass 
{ 
    public static string GetStuff() 
    { 
     return string.Empty; 
    } 
} 

public static class MyClassExtension 
{ 
    public static string GetOtherStuff(this MyClass myClass) 
    { 
     return string.Empty; 
    } 
} 

は使用方法:

MyClass.GetStuff(); 
MyClass.GetOtherStuff();  // Cannot resolve symbol 'GetOtherStuff' 
new MyClass().GetOtherStuff(); // This works 

しかし、私はMVCフレームワークは、私は拡張することができますことに気づきましたHtmlHelpersを使用して、クラスのインスタンスを作成せずに拡張メソッドを使用できるようにします。私はこのようなHtmlHelperための拡張メソッド作成した場合たとえば、私は本当に私と同じ結果を達成したいと思います

@Html.MyHtmlHelper() // no need to instantiate a class 

public static string MyHtmlHelper(this HtmlHelper helper) 
{ 
    return string.Empty; 
} 

を私はこのようなカミソリビューでそれを使用することができますMyClassだから私はできる:

MyClass.GetOtherStuff() 

私はそれをどうすればいいですか?

+15

'@ Html'はクラスのインスタンスではないと思いますか? –

+0

詳細を教えていただけますか? MyClass()の表記を使用する必要がないように、その結​​果をどのように達成できますか? – tocqueville

+1

Razorビューでは、 '@Html'は[このプロパティ]です(https://msdn.microsoft.com/en-us/library/system.web.mvc.webviewpage.html(v = vs.118).aspx #P:System.Web.Mvc.WebViewPage.Html)。使用時に(Razorのように)基本クラスの要件を適用する場合は、これを達成することができます。 –

答えて

-1

拡張メソッドを使用してクラスに静的メソッドを追加することはできません。

意味がありません。あなたが提案していることは、新しいヘルパーメソッドで2番目の静的クラスを作成することと変わりありません。ちょうどそれを行う。

あなたはこれをしたい:

public class MyClass 
{ 
    public static string GetStuff() 
    { 
     return string.Empty; 
    } 

    // Extension method. 
    public static string GetOtherStuff() 
    { 
     // cannot use any non-public members of MyClass 
     return string.Empty; 
    } 
} 
MyClass.GetStuff(); 
MyClass.GetOtherStuff(); 

上記ことはできません。また、それだけでやって上であなたに何の利点を与えないだろう:

public class MyClass 
{ 
    public static string GetStuff() 
    { 
     return string.Empty; 
    } 
} 

public class MyClassExtension : MyClass 
{ 
    public static string GetOtherStuff() 
    { 
     // also cannot use any non-public members of MyClass 
     return string.Empty; 
    } 
} 
MyClassExtension.GetStuff(); 
MyClassExtension.GetOtherStuff(); 
+0

これは質問に答えません。 'new MyClass()'という表記法を使わずに最初のクラスを拡張する方法を尋ねながら、別のクラスを作成することを提案しています。私がそのようにファーストクラスを拡張する必要がある特定のアーキテクチャ上の理由があります。 – tocqueville

+0

@tocquevilleはいそうです。静的な拡張メソッドを追加することはできません。 .NETはそれをサポートしていません。 'MyClass'を正常に変更し、あなたが望むものを得ることができます。または、2番目の例のように2番目のクラスを作成し、 'MyClassExtension.GetOtherStuff()'を呼び出すこともできます。最終的な選択肢の1つは、 'MyClassExtension:MyClass'です... – Kempeth

0

いいえ、あなたはのインスタンスを必要としないC#の拡張メソッドを作成することはできません。

public class MyClass 
{ 
    public static string GetStuff() 
    { 
     return string.Empty; 
    } 
} 

public class MyClassExtension 
{ 
    public static string GetOtherStuff() 
    { 
     // also cannot use any non-public members of MyClass 
     return string.Empty; 
    } 
} 
MyClass.GetStuff(); 
MyClassExtension.GetOtherStuff(); 

最後にもう一つの選択肢は、サブクラスを作成することですクラス。 (Here's a longer explanation

オプション#1

ただし、カミソリビュー内の既存の@Html/HtmlHelperをオフにハングアップする、あなたの拡張メソッドを作成することができます。

public static class HtmlHelperExtensions 
{ 
    public static string GetOtherStuff(this HtmlHelper helper) 
    { 
     return "other stuff"; 
    } 
} 

オプション#2

それはあなたがして.cshtmlかみそりビューからちょうど同じようにアクセスできるように、HtmlHelperの独自の同等のものを作成することも可能です。

はあなたの拡張メソッドを拡張するために、空のクラスを定義します。

public class MyCustomHelper 
{ 
    // Can just be an empty class. 
} 

public static class MyCustomHelperExtensions 
{ 
    public string GetStuff(this MyCustomHelper helper) 
    { 
     return "stuff"; 
    } 
} 

public static class MyOtherCustomHelperExtensions 
{ 
    public string GetOtherStuff(this MyCustomHelper helper) 
    { 
     return "other stuff"; 
    } 
} 

HtmlHelperインスタンスがa property on WebViewPage.csからアクセスされます。このように表示

public class BaseViewPage<TModel> : WebViewPage<TModel> 
{ 
    private MyCustomHelper _foo; 

    public MyCustomHelper Foo 
    { 
     get 
     { 
      if (_foo == null) 
      { 
       _foo = new MyCustomHelper(); 
      } 

      return _foo; 
     } 
     set 
     { 
      _foo = value; 
     } 
    } 
} 

public class BaseViewPage : WebViewPage 
{ 
    private MyCustomHelper _foo; 

    public MyCustomHelper Foo 
    { 
     get 
     { 
      if (_foo == null) 
      { 
       _foo = new MyCustomHelper(); 
      } 

      return _foo; 
     } 
     set 
     { 
      _foo = value; 
     } 
    } 
} 

そしてカミソリからのアクセス:あなたはあなた自身のクラスとthen configure Razor to use that insteadWebViewPageを拡張することができ

<div> 
    @Foo.GetOtherStuff() 
</div> 
+0

しかし、私はHtmlHelperを拡張する方法を求めていません。あなたが私の質問を読んでいれば、私はすでにそれをしているのを見るでしょう。私は独自のカスタムC#クラスで同様の結果を得る方法を尋ねています。そのため、new myClass()という表記法を使用せずに拡張メソッドを追加することができます。私は拡張メソッドをこのように使えるようにしたい: 'MyClass.MyExtensionMethod()'。 – tocqueville

+0

@tocqueville、申し訳ありませんが、答えの最初の行で述べたように、クラスのインスタンスを持たずに拡張メソッドを作成することはできません_ [この回答はこちら](http://stackoverflow.com/a/866932/590382)に理由が説明されています。ただし、追加した「Option#2」を使用して、Razorビューの視点から同じ効果を得ることができます。 –

-1

は、あなたは自分の各モジュールでBaseClassの継承でした:

public abstract class MyBaseClass 
{ 
    public static string SomeProperty { get; set; } 

} 

//Module 1 
public class MyClassOne : MyBaseClass 
{ 
    public static string MyFunction() 
    { 
     return SomeProperty + "MyClassOne"; 
    } 
} 

//Module 2 
public class MyClassTwo : MyBaseClass 
{ 
    public static string MyFunction() 
    { 
     return SomeProperty + "MyClassTwo"; 
    } 
} 

これは、あなたが行うことができます:

MyClassOne.MyFunction() 
+0

下の欄の説明は参考になります! – Scrobi

-1

リフレクションを使用して、クラスに静的メソッドを追加できます。このStackoverflow answerは、リフレクションを使用してメソッドを追加する方法についていくつか考えています。

関連する問題