隨著專案擴展方法增多,Visual Studio 智能提示 (IntelliSense) 會被大量擴展方法淹沒,導致原生方法難以發現、擴展方法分類混亂。本文探討三種分組管理策略,從簡單到進階,解決「喧賓奪主」問題。
對 string 擴展幾十個方法後,輸入 "abc". 時提示列表冗長,開發者難以快速找到目標方法。
將不同領域擴展放入不同命名空間,按需 using:
namespace MyApp.Extensions.String.Chinese { ... } // 中文處理
namespace MyApp.Extensions.String.Conversion { ... } // 轉換操作
namespace MyApp.Extensions.String.Regex { ... } // 正則操作
缺點:單一命名空間內方法過多仍會污染提示;需記住多個命名空間;頻繁切換 using 麻煩。
定義「分組進入點」擴展方法,回傳專用包裝類型,以 AsXxx 為前綴:
public static class StringExtensions
{
public static ChineseString AsChinese(this string s) => new ChineseString(s);
public static ConvertableString AsConvertable(this string s) => new ConvertableString(s);
public static RegexString AsRegex(this string s) => new RegexString(s);
}
public class ChineseString
{
private readonly string _s;
public ChineseString(string s) => _s = s;
public string ToDBC() => ...; // 全形轉半形
public string ToSBC() => ...; // 半形轉全形
public string GetChineseSpell() => ...; // 取拼音首字母
}
public class ConvertableString { /* ToInt, ToDateTime, ToEnum... */ }
public class RegexString { /* Match, Replace, Split... */ }
"全形測試".AsChinese().ToDBC(); // 智能提示僅顯示中文相關方法
"123".AsConvertable().ToInt(); // 僅顯示轉換方法
"abc123".AsRegex().Match(@"\d+"); // 僅顯示正則方法
優點:
As 開頭排在提示最前,易發現缺點:
.AsXxx() (可接受)Equals/ToString 混雜 (可再包裝 Extensions 屬性改善)利用 C# 7.0+ readonly struct 避免堆疊分配,並隱藏包裝類型細節:
public static class StringExt
{
public static ChineseExt Chinese(this string s) => new ChineseExt(s);
public readonly struct ChineseExt
{
private readonly string _s;
public ChineseExt(string s) => _s = s;
public string ToDBC() => ...;
public string ToSBC() => ...;
}
// 其他群組類似...
}
IsNullOrEmpty()、ToMd5() 等核心高頻方法,直接掛在 string 上AsChinese()、AsRegex() 等As{Domain},內部方法使用標準動詞 ToXxx/GetXxx/Match