2010-11-19 228 views
5

我想知道如果我可以使用扩展方法或其他技术来扩展静态类如 System.Net.Mime.MediaTypeNames.Image,它的类型比我需要的少。扩展方法扩展静态类

+0

您不能扩展静态类;搜索这个问题的重复,你会看到一些解决方法。 – BeemerGuy 2010-11-19 01:39:40

+0

你为什么要这样做?静态类没有上下文,任何你可以在静态类内部的任何地方都可以在代码中的“任何地方”完成。 – 2010-11-19 07:42:44

+0

@Amby - 我想你可能只是想为组织采购做点什么。当然,你可以用必要的方法创建一个静态的ImageUtility类(根据这个答案,他将不得不做任何事情),但我认为OP希望以他不需要额外类的方式组织他的代码。不幸的是,你不能。 (我来这里期望做同样的事情)。 – MattW 2012-08-06 13:52:20

回答

6

不,扩展方法只能用于添加实例方法,而不能用于静态方法(甚至属性)。扩展方法实际上只是静态方法中的句法糖。例如,当您使用的扩展方法如Count():

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

这实际上编译:

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

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

+0

说“扩展方法只能用于添加实例方法”是否正确?正如你所解释的那样,它们只是表现为实例方法。它们实际上不是实例方法,或者您将能够访问该类的非公共成员。 – 2014-07-27 23:01:38

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参数,并且可以简单地使用原始类的静态方法。