将方法扩展到任何实例真的很容易:
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/