善用 C# 3.0 Extensions 方法 -- 以及常用辅助方法集

C#3.0 的许多功能,大家讨论LINQ 的比较多,大概是LINQ的语法对于C#等语言来说确实新奇。但对于Extension Method,可能讨论的就比较少了,即使它也是LINQ的重要基石之一。 或许大家觉得这东西过于简单以至于无需一提? 但是在我参与的项目中,其实很多适用于 Extension Method 的地方,大家却根本就没有意识到。

Extension Method 的一个主要用途便是构造辅助方法。 在编程中为了抽象和简化,我们会把一些常用但又不好专门为它们创建一个对象类的方法放到所谓的Helper 中,在使用时调用 Helper.Xxxx()。例如:

public static class Helper
{
    public static SecureString ToSecureString(string value)
    {
        SecureString result = new SecureString();
        foreach (char c in value.ToCharArray())
        {
            result.AppendChar(c);
        }
        return result;
    }

    public static T ToEnum<T>(string value, bool ignoreCase) where T : struct
    {
        return (T) Enum.Parse(typeof(T), value, ignoreCase);
    }
}

我们通过调用 Helper.ToSecureString(“something”), Helper.ToEnum<BrowserType>(input, true) 等,但是各种不同目的的方法都通过以Helper类来引用总让人感觉有些不伦不类。如果采用Extension Method,事情可能就会简单许多:

public static class Extensions
{
    public static SecureString ToSecureString(this string value)
    {
        // convert to SecureString
    }

    public static T ToEnum<T>(this string value, bool ignoreCase) where T : struct
    {
        // convert to enum.
    }
}

使用的话也会干净许多:

static void Method(string password, string browserString)
{
    SecureString secured = password.ToSecureString();
    BrowserType browerType = browserString.ToEnum<BrowserType>(true);
}

Extension Method 的本质其实就是一个编译器魔法,编译器会把 password.ToSecureString() 替换成 Extensions.ToSecureString(password), 其编译生产的代码完全可以在.NET 2.0 下运行。 另外,由于使用Extension Method,客户代码并没有引用类名 ”Extensions” or “Helper”, 使得我们当辅助方法越来越多而需要将Helper/Extension类拆分成诸如 StringHelper, XmlHelper, EnumHelper 的时候,客户代码不需要作任何修改。实际上这也符合一条设计原则 – Open Close 原则。

有人对Extension不以为然,认为需要使用 Extension 说明原有类型或接口的设计不完善或不仔细,其实这是两码事。 类型设计的原则之一是单一职责,不应该让一些不相干的方法来污染了类型本身。 例如,ToSecureStirng 应该是 string 的一个方法吗? ToEnum 应该是它的功能吗?当然不是。 Extension Method的使用却是为了提供方便,提高可读性,或提供一些粘接能力。

我的工作之一是为团队编写一些Common的类型和方法,我会在后续的一些文章里列出一些我常用的Extension 方法,这篇算是一个目录吧。

我常用的主要辅助方法有:

常见辅助方法集 -- Enumerable

 

posted @ 2009-12-29 14:16  Ahha  阅读(5329)  评论(14编辑  收藏  举报