静态扩展方法[重复]
Posted
技术标签:
【中文标题】静态扩展方法[重复]【英文标题】:Static extension methods [duplicate] 【发布时间】:2010-10-26 09:35:05 【问题描述】:有什么方法可以给类添加静态扩展方法。
特别是我想重载Boolean.Parse
以允许int
参数。
【问题讨论】:
看来你做不到。 See here for a discussion on it 不过我很想被证明是错误的。 这怎么可能是重复的?这想将行为类似于静态(类)方法的扩展方法添加到可以具有像布尔值这样的实例的类中,而另一个问题询问如何向静态类添加扩展方法 如果 C# 支持这样的语法就好了:“public static DependencyProperty Register(static DependencyProperty x, string name, Type propertyType, Type ownerType, FrameworkPropertyMetadata typeMetadata)”,这样我就可以在 Silverlight 中使用它实现与 WPF 语法的兼容性(包装 Dr.WPF 的 DependencyProperty 值强制实现)。注意“static DependencyProperty”参数而不是“this DependencyProperty”参数(或者代替静态,也许他们可以使用其他关键字,如 type 或 typeof)Enum.Parse
提供字符串的问题相同。不幸的是,扩展字符串并不像扩展 int 那样明显。 C# 缺少语法!
我认为 Shapes 在即将发布的 C# 规范中可以实现这一点
【参考方案1】:
简而言之,不,你不能。
长答案,扩展方法只是语法糖。即:
如果你有一个字符串的扩展方法,让我们说:
public static string SomeStringExtension(this string s)
//whatever..
当你调用它时:
myString.SomeStringExtension();
编译器只是把它变成:
ExtensionClass.SomeStringExtension(myString);
如您所见,静态方法无法做到这一点。
我突然想到另一件事:能够在现有类上添加静态方法的真正意义是什么?你可以拥有自己的帮助类来做同样的事情,那么这样做的真正好处是什么:
Bool.Parse(..)
对比
Helper.ParseBool(..);
并没有真正带来太多好处......
【讨论】:
能够在现有类上添加静态方法的真正意义是什么?在很多情况下,我都想重复这样做。我的理由是:我想扩展String.Reconvert
作为扩展方法。我可以写 Helper.ReconvertString
,但使用 Visual Studio 和自动完成,我的同事不会在 Helper
下查看。他们会寻找String
方法,但找不到,可能会重新发明***。
我完全不同意,它的好处与实例化扩展方法提供的好处相同。我也可以使用辅助类来实现与普通扩展方法相同的目的,但是当扩展方法使用起来更加优雅时,我为什么要这样做。语法糖很有用,无论是实例化的还是静态的。
我认为他们会带来与语法糖一样多的东西。这是关于可访问性和您期望它们在流行类中的位置,而不是在不起眼的助手中。例如,像 DateTime.FromNanoseconds 这样的扩展方法会很有帮助,或者 DateTime.FromSecondsSinceEpoch。这些作为实例方法没有意义,因为它们本质上是构造函数,但它们作为静态扩展方法很容易找到。原因是框架类根本不完整,扩展方法是完成它们的一种解决方法。
@Triynko 是对的。在上面的示例中,Helper 类在哪里以及是什么?怎么知道在哪里可以找到它以及它在哪个命名空间中?由于这些原因,出现在您期望它们的位置的扩展是一个有用的功能。
我认为这个答案可以编辑为“否”,因为这只是语言设计的问题。其余答案中没有任何内容表明在语言中实现静态扩展方法时存在任何冲突。【参考方案2】:
特别是我想重载
Boolean.Parse
以允许 int 参数。
int 的扩展是否有效?
public static bool ToBoolean(this int source)
// do it
// return it
那么你可以这样称呼它:
int x = 1;
bool y = x.ToBoolean();
【讨论】:
创造力+1。您没有回答他的问题,但我相信您找到了最优雅的解决方案。特别是考虑到“解析”的字面意思是分析 string :) (参见definition) 别忘了,int 是一个值类型。你需要像@bsneezey=x.ToBoolean()
写的那样使用它,因为在值类型的扩展方法中,值是NOT通过引用传递的。【参考方案3】:
不,但你可以有类似的东西:
bool b;
b = b.YourExtensionMethod();
【讨论】:
以上是关于静态扩展方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章
GroovyGroovy 扩展方法 ( 扩展静态方法示例 | 扩展实例方法示例 | 扩展实例方法与扩展静态方法代码相同 )
GroovyGroovy 扩展方法 ( 静态扩展方法配置 | 扩展方法示例 | 编译静态扩展类 | 打包静态扩展类字节码到 jar 包中 | 测试使用 Thread 静态扩展类 )