1

将方法扩展到任何实例都非常简单:

public static string LeaveJustNumbers(this string text)
{
    return Regex.Replace(text, @"[\D]", "");
}
...
string JustNumbers = "A5gfb343j4".LeaveJustNumber();

但是,如果我想将方法​​扩展到像字符串这样的密封类,工作方式如下:

string.Format("Hi:{0}","Fraga");

有什么办法吗?

4

1 回答 1

4

如果您正在谈论“扩展”静态方法(或替换现有方法),那么据我所知,不,您不能这样做,我不确定您为什么要这样做。

扩展方法的要点是调用风格是对实例的方法调用。它允许更优雅的语法和方法链接等。例如,没有扩展方法的 LINQ 会非常痛苦。

你有三个选择,其中一个非常可怕:

制作一个普通的扩展方法,对静态方法进行调用

public static string SomeExtensionMethod(this string name) 
{
    return string.Format("Hi:{0}", name);
}

用法:

Console.WriteLine("Mr Smith".SomeExtensionMethod());

创建一个静态助手类并使用它进行调用

 Console.WriteLine(MyHelperClass.SomeMethod("Mr Smith"));

还有那个邪恶的

创建一个与您想要“扩展”的类型同名的静态辅助类(例如公共类 String)……然后复制静态目标方法的签名(格式),然后看着每个人在看到名为“string”的类型不是来自“System”命名空间,他们必须使用 String=MyCrazyHacks.String 和/或显式命名空间来分散他们的 .cs 文件。

我什至不确定您是否可以对“字符串”执行此操作,因为它是 System.String 的别名,因此我将示例更改为使用名称“字符串”。

namespace MyCrazyHacks
{
    public static class String
    {
        public static System.String Format(
         System.String str, params object[] zeParams)
        {
            // do bad, unspeakable things that confuses everyone
            return System.String.Format(....); 
        }
    }
}

注意:请不要这样做,因为你会造成很大的痛苦......

于 2010-05-02T01:58:12.853 回答