2009-06-25 34 views
2

我正在构建一个将用于多个产品版本的库,其部分工作是增强.NET 1.1中不存在的一些功能,因为我们需要使用它。可能的最好的例子就是String.IsNullOrEmpty方法,它的功能我们相当依赖。什么是在.NET 1.1中扩展密封类的干净/直观的方法?

.NET中的String类是密封的;我想过使用Adapter或Decorator模式来通过包装原始字符串来扩展类的功能,但我不相信这是一个非常直观的方法,我正在尝试做什么。我也看过another post on StackOverflow关于类似的问题,但它再次提出我刚刚提到的问题。

我肯定可以使用适配器创建我要找的功能,但我无法想象这样做,每串:

bool isEmpty = new StringExtensionAdapter(myXmlNode.SelectSingleNode(myXpathString)).IsNullOrEmpty(); 
if (isEmpty) 
{ 
    // Do something 
} 

我并不喜欢这种做法,但似乎就像它导致大量的内存管理,其中不同的解决方案可能会更好。另外,我对创建一个“StringUtility”库并不着迷,因为这种方法让我远离了我想要遵循的面向对象设计。

任何输入都会有帮助;如果我只是疯了,应该使用这些方法之一,让我知道。因为我有几个,我正在寻找更多的最佳实践,而不是解决方案。

+0

我只是想建议Adapter模式,写一个小样本,但...看来你已经提到它:( – 2009-06-25 21:45:16

回答

3

我宁愿个人使用静态IsNullOrEmpty方法的“StringUtility”库。实质上,你将创建extension methods而没有用于调用它们的好语法。

2

根据定义,没有干净的做法。我认为适配器方法在.NET 1.1中是最好的。当然,这会要求你在与外界打交道时来回走动。

0

我同意马修的观点,没有干净的做法。 Decorator模式不适用,因为它依赖于继承(或者至少是多态性),并且不能装饰System.String,因为您无法创建具有相同接口的类(因为它是密封的)。

适配器基本上用于将一个接口调整到另一个接口。这不是你想要在这里做的。从本质上讲,你似乎想到的是一个包装,但正如马修指出的,你将不得不来回转换很多东西。

也许你可以命名你的新类型“文本”并实现向字符串和字符串的隐式转换,以最小化你需要写的强制转换量。如果你选择这条路线,确保你将你的类型设计为不可变类型,因为这与字符串本身的行为是一样的。

0

您可以使用一个隐含的操作使事情变得更加“自然”:

public class SuperString 
{ 
    public SuperString(string s) { S = s; } 

    public static implicit operator SuperString(string s) 
    { 
     return new SuperString(s); 
    } 

    public string S { get; private set; } 

    public bool IsNot() { return String.IsNullOrEmpty(S); } 
} 

[TestMethod] 
public void Test_SuperString() 
{ 
    SuperString ss = "wee"; 
    SuperString xx = ""; 
    if (xx.IsNot()) ss = "moo"; 
    System.Console.WriteLine(ss.S); 
} 
相关问题