我有这个扩展方法:
public static T Foo<T>(this Object current) where T : class, new()
{
...
}
是否可以从"此对象当前"中排除基元类型和 IEnumerable 接口?
编辑我的问题不是重复的,因为在建议的问题中,问题是重载方法之间的参数冲突。作者问,是否可以从其中一个方法中排除字符串类型,以便为另一种方法选择它提供能力。对这个问题的有用回答对我没有帮助
不。你不能。没有可用于此类内容的泛型类型约束。一个选项可能是指定一个标记为Obsolete
的方法:
[Obsolete("Do not use with IEnumerable!", true)]
public static T Foo<T>(this IEnumerable current) where T : class, new()
{
...
}
你确实知道这个列表会变得无穷无尽。另一种选择是 Roslyn 代码分析器,它会检查您的代码是否存在不允许的组合,但这可能有点矫枉过正。
帕特里克·霍夫曼(Patrick Hofman(给出了正确的答案
可能的方法
正如Evk allready在他的评论中所说。
根据要允许的类型数,可以显式允许这些类型。
糟糕的方法
警告:请勿使用以下方法!
/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="current">Dont throw in IENumerables !</param>
/// <returns></returns>
public static T Foo<T>(this Object current) where T : class, new() {
if (current is IEnumerable) {
throw new NotSupportedException($"Type {current.GetType()} is not supported!");
}
//...
}
为什么这是一个糟糕的方法?-> 这可能会导致应用程序崩溃。
为什么帕特里克的方法更好? -> 他的方法会导致编译器警告/错误,这比在生产中出现应用程序崩溃要好。