2014-02-24 46 views
1

考慮下面的代碼:使用嵌套類中定義的擴展方法

1. namespace MyNS { 
2. // A class 
3. public class MyClass { 
4.  public string Do() { 
5.  return string.Blank(); 
6.  } 
7.  // A nested type 
8.  protected static class Helper { 
9.  public static string Blank(this string str) { 
10   return String.Empty; 
11.  } 
12.  } 
13. } 
14. } /* namespace */ 

然而管線5將導致程序不進行編譯。我知道爲了使用擴展方法,必須創建一個靜態類,並通過using指令引用它的封閉名稱空間。

如何在靜態類是嵌套類時實現此目的?

+0

我以前遇到過這個,基本上:你不能。相反,我做了我的靜態類'internal',在我的情況下證明是足夠的。 – MadSkunk

+1

http://blog.slaks.net/2011/07/creating-local-extension-methods.html – SLaks

+0

你是在字符串類型別名而不是字符串變量/字段上調用Blank()嗎? – elolos

回答

4

這是不能做到的。擴展方法不能在嵌套類中定義。

儘管實現此功能並沒有太大障礙,但它確實感覺相當麻煩:嵌套類中的擴展方法看起來有些過分,因爲它們也可能被定義爲外部類本身的一部分。

此外,它確實迫使你清楚地組織這個作爲你的類的擴展(你是必須的),而不是它們的一部分。

如果你只是想在本地定義它們(就像其他相關功能一樣),你可能想嘗試在嵌套命名空間聲明中創建擴展方法SLaks' trick,使得這個新命名空間內的類不再「嵌套」。

3

你不能。要將該方法作爲擴展方法,它需要位於非嵌套類中。