在.NET中扩展String类是否可行

6
如何重写或扩展.NET的主要类。例如:
public class String
{
    public boolean contains(string str,boolean IgnoreCase){...}
    public string replace(string str,string str2,boolean IgnoreCase){...}
}

之后

string aa="this is a Sample";
if(aa.contains("sample",false))
{...}

这是可能的吗?

4个回答

22

String类是密封的,所以你不能从它继承。 扩展方法是最好的选择。 它们具有与实例方法相同的感觉,但没有继承的成本。

public static class Extensions {
  public static bool contains(this string source, bool ignoreCase) {... }
}

void Example {
  string str = "aoeeuAOEU";
  if ( str.contains("a", true) ) { ... }
}

若要使用扩展方法,您需要使用VS 2008。


@JaredPar: 一个修正,你不需要VS 2008来使用扩展方法。你需要C# 3.0的C#编译器,它包含在.NET 3.5中。VS 2008只是集成开发环境,而不是提供这个功能的源头。 - casperOne
2
@casperOne,没错。我通常说VS 2008,因为它更为人所知。更有趣的是,如果您提供自己的扩展属性,您甚至可以编译2.0应用程序与扩展方法。http://blogs.msdn.com/jaredpar/archive/2007/11/16/extension-methods-without-3-5-framework.aspx - JaredPar
3
回应 @casperOne 的话,"或者单声道2.0" ;-p - Marc Gravell

2

String类是密封的,因此您无法扩展它。如果您想要添加功能,可以使用扩展方法或将其包装在自己的类中,并提供所需的任何其他功能。


1

一般来说,您应该尝试看看是否有其他方法能够以类似的方式满足您的需求。对于您的例子,Contains 实际上是 IndexOf 的包装方法,如果返回值大于 0,则返回 true,否则返回 false。恰好,IndexOf 方法有许多重载,其中之一是 IndexOf( string, StringComparison ): Int32,可以指定是否区分大小写。

有关更多信息,请参见 String.IndexOf Method (String, StringComparison) (System),尽管示例有点奇怪。

请参见 StringComparison Enumeration (System),了解使用 StringComparison 枚举时可用的不同选项。


0

你也可以使用适配器模式来添加额外的功能。你可以进行运算符重载,使其感觉像内置字符串一样。当然,对于现有的“string”使用情况,这并不会自动完成,但如果可能的话,直接从中继承也不是解决方案。


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