扩展静态类的扩展方法

6
我想知道是否可以使用扩展方法或其他技术来扩展静态类,例如System.Net.Mime.MediaTypeNames.Image,它的类型比我需要的少。请注意不要删除HTML标签。

你不能扩展静态类;在SO上搜索此问题的重复项,你会看到一些解决方法。 - BeemerGuy
你为什么需要那个?静态类没有上下文,而且你在静态类中所做的任何事情都可以在代码的“任何其他地方”完成。 - Manish Basantani
@Amby - 我认为你可能想单纯地出于组织目的这样做。当然,你可以创建一个带有必要方法的静态ImageUtility类(根据此答案,他无论如何都必须这样做),但我认为OP想以一种不需要额外类的方式组织他的代码。不幸的是,你不能这样做。(我来到这里也是为了同样的事情)。 - MattW
@ManishBasantani 如果能以这种方式扩展静态类就太好了。例如,如果您可以向“Math”添加扩展方法,那将比在各个地方都有多个“MathHelper”类要好得多。 - Dave Cousineau
2个回答

7
不,扩展方法只能用于添加实例方法,而不能添加静态方法(甚至属性)。扩展方法实际上只是围绕静态方法的语法糖。例如,当您使用像Count()这样的扩展方法时:
var list = GetList();
var size = list.Count();

这实际上被编译为:

var list = GetList();
var size = Enumerable.Count(list);

使用扩展方法无法向现有类添加额外的静态方法。


“扩展方法只能用于添加实例方法”这种说法是否正确?正如您所解释的那样,它们只是看起来像实例方法。它们实际上并不是实例方法,否则您将无法访问类中的非公共成员。 - Dave Cousineau

0
不,目前在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参数,可以直接使用原始类的静态方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接