静态扩展方法

Mid*_*hat 157 c# extension-methods

可能重复:
我可以向现有静态类添加扩展方法吗?

有什么办法可以为类添加静态扩展方法.

特别是我想重载Boolean.Parse以允许int参数.

BFr*_*ree 148

总之,不,你不能.

答案很长,扩展方法只是语法糖.IE:

如果你对字符串有一个扩展方法,那就说:

public static string SomeStringExtension(this string s)
{
   //whatever..
}
Run Code Online (Sandbox Code Playgroud)

然后你打电话给它:

myString.SomeStringExtension();
Run Code Online (Sandbox Code Playgroud)

编译器只是把它变成:

ExtensionClass.SomeStringExtension(myString);
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,静态方法无法做到这一点.

还有一件事让我意识到:能够在现有类上添加静态方法真正意义何在?您可以拥有自己的帮助程序类来执行相同的操作,因此能够执行以下操作的真正好处是:

Bool.Parse(..)
Run Code Online (Sandbox Code Playgroud)

Helper.ParseBool(..);
Run Code Online (Sandbox Code Playgroud)

真的没有带来太多的东西......

  • *能够在现有类上添加静态方法真正的重点是什么?*我想在很多情况下反复这样做.我的理由是:我想扩展`String.Reconvert`作为扩展方法.我可以编写`Helper.ReconvertString`,但是使用Visual Studio并自动完成,我的同事不会看"帮手".他们会寻找一个`String`方法,而不是找到一个,可能去重新发明轮子. (190认同)
  • 我完全不同意,它的好处与实例扩展方法提供的好处相同.我也可以使用辅助类来实现与普通扩展方法相同的目的,但是为什么扩展方法更加优雅.句法糖很有用,无论是实例还是静态. (113认同)
  • 我认为就语法糖而言,它们会带来同样多的东西.这是关于可访问性的东西,你期望它们在流行的课程中,而不是在模糊的帮助者.例如,像DateTime.FromNanoseconds这样的扩展方法会有所帮助,或者是DateTime.FromSecondsSinceEpoch.这些作为实例方法没有意义,因为它们本质上是构造函数,但它们很容易找到,就像静态扩展方法一样.原因是框架类很简单,扩展方法是完成它们的一种解决方法. (41认同)
  • @Triynko是对的.在上面的例子中,**Helper**类的位置和内容是什么?怎么会知道在哪里找到它以及它在哪个命名空间?出于这些原因,出现在您期望的地方的扩展是一个有用的功能. (23认同)
  • 我认为这个答案可以编辑为"否",因为这只是语言设计的问题.答案的其余部分中没有任何内容表明在语言中实现静态扩展方法时存在任何冲突. (4认同)
  • 我可以想一个你想要静态扩展方法的好例子.甚至`Int32`类提供了`Parse(String)`,`Parse(String,IFormatProvider)`,`Parse(String,NumberStyles)`,`Parse(String,NumberStyles,IFormatProvider)`重载但是`Boolean`类提供了只有`Parse(String)`.即使只是一个`Bool.Parse(String,IFormatProvider)`重载也不是很好,你可以翻译其他语言的真/假值吗?例如Cierto/Falso(西班牙语),Vrai/Faux(法语)和Правда/Ложь(俄语)? (2认同)
  • @JohnWhite 显然你还没有阅读这个问题下面的热门评论:) (2认同)

bsn*_*eze 76

特别是我想重载Boolean.Parse以允许int参数.

int的扩展是否有效?

public static bool ToBoolean(this int source){
    //do it
    //return it
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样调用它:

int x = 1;

bool y=x.ToBoolean();
Run Code Online (Sandbox Code Playgroud)

  • 创意+1.你没有回答他的问题,但我相信你找到了最优雅的解决方案.特别是考虑到字面意思是"解析"意味着分析_string_ :)(参见[定义](http://en.wikipedia.org/wiki/Parsing)) (20认同)