扩展静态类的扩展方法[重复]

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 扩展方法 ( 扩展静态方法示例 | 扩展实例方法示例 | 扩展实例方法与扩展静态方法代码相同 )

扩展方法

扩展方法