2013-05-13 64 views
0

是否有可能在不引用其類的情況下調用方法?快速引用靜態方法

例如,你有一個輔助類:

class HelperTools 
{ 
    public static void DoWork() 
    { /*...*/ } 
} 

然後你需要調用它:

class MainClass 
{ 
    public static void Main() 
    { 
     HelperTools.DoWork(); 
    } 
} 

是否有可能調用DoWork();沒有參考?像這樣:

public static void Main() 
{ 
    DoWork(); 
} 

只是爲了簡單起見。

+0

爲什麼?這有什麼實際用途?嚴重的問題,我很好奇。 – 2013-05-13 23:50:42

+0

有一些方法可以做到這一點(例如,調用靜態方法的私有方法,使其成爲'class MainClass:HelperTools',動態調用),但對於熟悉如何在C#中正常完成任何事情的人來說,這是非常不直觀的。普通的C#方法是簡單地調用HelperTools.DoWork();或者對於擴展方法,調用myObj.MyExtensionMethod()。 – 2013-05-13 23:52:43

+1

@SimonWhitehead簡潔。注意「快捷方式」標籤 - 我只是在尋找更快的方法來調用方法。 – Seist 2013-05-14 00:02:05

回答

6

不完全是,但這裏有5種模式,讓你接近:

namespace My.Namespace 
{ 
    using H = MyHelperClass; 

    public class MyHelperClass 
    { 
     public static void HelperFunc1() 
     { 
      Console.WriteLine("Here's your help!"); 
     } 
    } 

    public class MyHelperClass2 
    { 
     public static void HelperFunc4() 
     { 
      Console.WriteLine("Here's your help!"); 
     } 
    } 

    public interface IHelper{ } 

    public static class HelperExtensions 
    { 
     public static void HelperFunc3(this IHelper self) 
     { 
      Console.WriteLine("Here's your help!"); 
     } 
    } 

    public class MyClass : MyHelperClass2, IHelper 
    { 
     private static readonly Action HelperFunc2 = MyHelperClass.HelperFunc1; 

     private static void HelperFunc5() 
     { 
      Console.WriteLine("Here's your help!"); 
     } 

     public void MyFunction() 
     { 
      //Method 1 use an alias to make your helper class name shorter 
      H.HelperFunc1(); 
      //Method 2 use a class property 
      HelperFunc2(); 
      //Method 3 extend an interface that has extension methods. 
      //Note: you'll have to use the this keyword when calling extension 
      this.HelperFunc3(); 
      //Method 4 you have access to methods on classes that you extend. 
      HelperFunc4(); 
      //Method 5 put the helper method in your class 
      HelperFunc5(); 
     } 
    } 
} 
4

編號Java有像這樣導入靜態的概念,但C#沒有。 (IMO,裸DoWork()沒有任何線索,以實施駐留的位置是不理想的。)

0

可以調用從DoWork不必引用類名稱的唯一地方是類本身。例如,如果您添加一個非靜態方法HelperTools

public void foo() 
{ 
    DoWork(); 
} 

你可以從內部調用它DoWork,即使foo()也不是一成不變的。

+1

關閉,但這個答案不太準確;第一句話是錯誤的。它應該是:「唯一可以調用DoWork而不引用類名的地方在DoWork的*範圍內」。由於DoWork是內部類的公共方法,因此可以在派生類的主體中使用其非限定名稱。 – 2013-05-14 05:44:27

+0

良好的通話。謝謝。 – edtheprogrammerguy 2013-05-14 12:58:20