2014-02-24 47 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

你不能。要将该方法作为扩展方法,它需要位于非嵌套类中。