c# - 如何将方法扩展到一个类而不是它的实例

标签 c# static extension-methods instance extending

将方法扩展到任何实例真的很容易:

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

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

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

有什么办法吗?

最佳答案

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

扩展方法的要点是调用方式是实例上的方法调用方式。它允许更优雅的语法和方法链接,等等。例如,没有扩展方法的 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"));

还有邪恶的

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

我什至不确定您是否可以对“string”执行此操作,因为它是 System.String 的别名,所以我更改了示例以改用名称“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(....); 
        }
    }
}

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

关于c# - 如何将方法扩展到一个类而不是它的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2752137/

相关文章:

c# - 我如何计算和创建字符串变量而不是 int 变量?

c - 在函数内部使用静态变量

c++ - 静态初始化不安全调用的线程安全

c# - 类型 'MyEnum' 的表达式不能用于类型的参数

c# - 接口(interface)扩展方法,具有匹配的通用参数

c# - C# : why does this work? 中的扩展方法

c# - 属性支持字段 - 它有什么用?

c# - 获取 '' 缺少 SOI 标记。来自 JpegDecoderr

c# - 过滤列表对象的通用方法

Java:为什么静态字段彼此都是 "independent"?