我喜欢 C# 3.0。我最喜欢的部分之一是扩展方法。
我喜欢将扩展方法视为可以应用于广泛的类基础的实用函数。我被警告说这个问题是主观的,可能会被关闭,但我认为这是一个很好的问题,因为我们都有“样板”代码来做一些相对静态的事情,比如“XML 的转义字符串”——但我还没有找到收集这些的地方。
我对执行日志记录/调试/分析、字符串操作和数据库访问的常用函数特别感兴趣。那里有这些类型的扩展方法的库吗?
编辑:将我的代码示例移至答案。(感谢 Joel 清理代码!)
我喜欢 C# 3.0。我最喜欢的部分之一是扩展方法。
我喜欢将扩展方法视为可以应用于广泛的类基础的实用函数。我被警告说这个问题是主观的,可能会被关闭,但我认为这是一个很好的问题,因为我们都有“样板”代码来做一些相对静态的事情,比如“XML 的转义字符串”——但我还没有找到收集这些的地方。
我对执行日志记录/调试/分析、字符串操作和数据库访问的常用函数特别感兴趣。那里有这些类型的扩展方法的库吗?
编辑:将我的代码示例移至答案。(感谢 Joel 清理代码!)
您可能会喜欢MiscUtil。
还有很多人喜欢这个:
public static bool IsNullOrEmpty(this string s)
{
return s == null || s.Length == 0;
}
但由于 10 次或更多次中有 9 次我正在检查它是否为空或空,我个人使用这个:
public static bool HasValue(this string s)
{
return s != null && s.Length > 0;
}
最后,我最近捡到的一个:
public static bool IsDefault<T>(this T val)
{
return EqualityComparer<T>.Default.Equals(val, default(T));
}
用于检查 DateTime、bool 或 integer 等值类型的默认值,或 null 等引用类型。它甚至适用于物体,这有点令人毛骨悚然。
这是我的几个:
// returns the number of milliseconds since Jan 1, 1970 (useful for converting C# dates to JS dates)
public static double UnixTicks(this DateTime dt)
{
DateTime d1 = new DateTime(1970, 1, 1);
DateTime d2 = dt.ToUniversalTime();
TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks);
return ts.TotalMilliseconds;
}
和一个 ToDelimitedString 函数:
// apply this extension to any generic IEnumerable object.
public static string ToDelimitedString<T>(this IEnumerable<T> source, string delimiter, Func<T, string> action)
{
if (source == null)
{
throw new ArgumentException("Source can not be null.");
}
if (delimiter == null)
{
throw new ArgumentException("Delimiter can not be null.");
}
string strAction = string.Empty;
string delim = string.Empty;
var sb = new StringBuilder();
foreach (var item in source)
{
strAction = action.Invoke(item);
sb.Append(delim);
sb.Append(strAction);
delim = delimiter;
}
return sb.ToString();
}
这是使用 String.Join 编写的 Jeff 的 ToDelimitedString:
public static string ToDelimitedString<T>(this IEnumerable<T> source, string delimiter, Func<T, string> action) {
// guard clauses for arguments omitted for brevity
return String.Join(delimiter, source.Select(action));
}