扩展静态类的扩展方法[重复]
Posted
技术标签:
【中文标题】扩展静态类的扩展方法[重复]【英文标题】:extension method to extend static class [duplicate] 【发布时间】:2011-05-12 09:44:26 【问题描述】:我想知道是否可以使用扩展方法或其他技术来扩展静态类,例如
System.Net.Mime.MediaTypeNames.Image
,它的类型比我需要的少。
【问题讨论】:
你不能扩展静态类;搜索此问题的重复项,您会看到一些解决方法。 你为什么需要那个?静态类没有上下文,在静态类中可以做的任何事情都可以在代码中的“任何地方”完成。 @Amby - 我认为您可能只想出于组织目的而这样做。当然,您可以使用必要的方法创建一个静态 ImageUtility 类(根据这个答案,他无论如何都必须这样做),但我认为 OP 希望以他不需要额外类的方式组织他的代码.不幸的是,你不能。 (我来这里也是为了做同样的事情)。 @ManishBasantani 能够以这种方式扩展静态类会很棒。例如,如果您可以向Math
添加扩展方法会怎样?这比在整个地方拥有多个 MathHelper
类要好得多。
【参考方案1】:
不可以,扩展方法只能用于添加实例方法,不能用于静态方法(甚至是属性)。扩展方法实际上只是围绕静态方法的语法糖。例如,当您使用 Count() 等扩展方法时:
var list = GetList();
var size = list.Count();
这实际上编译为:
var list = GetList();
var size = Enumerable.Count(list);
您不能使用扩展方法向现有类添加额外的静态方法。
【讨论】:
“扩展方法只能用于添加实例方法”这样说对吗?正如您所解释的,它们只给出了实例方法的外观。它们实际上不是实例方法,否则您将能够访问该类的非公共成员。【参考方案2】:不,这在 C# 中还不可能,但希望它会在某个时候变得如此。而且你不能继承静态类并以这种方式添加新方法,因为静态类必须派生自object
。不过,您可以做的一件事(在您的代码中产生非常相似的效果)就是简单地声明另一个静态类,当您需要扩展方法时将使用它。例如:
public static class MessageBox2
public static DialogResult ShowError(string Caption, string Message, params object[] OptionalFormatArgs)
return MessageBox.Show(string.Format(Message, OptionalFormatArgs), Caption, MessageBoxButtons.OK, MessageBoxIcon.Error);
由于原类是静态的,根据定义,“扩展”方法不需要接收实例作为this
参数,可以简单地使用原类的静态方法。
【讨论】:
以上是关于扩展静态类的扩展方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章
GroovyGroovy 扩展方法 ( 扩展静态方法示例 | 扩展实例方法示例 | 扩展实例方法与扩展静态方法代码相同 )