是否可以从对象参数中排除 IE无数和基元类型



我有这个扩展方法:

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!");
        }
        //...
}

为什么这是一个糟糕的方法?-> 这可能会导致应用程序崩溃。

为什么帕特里克的方法更好? -> 他的方法会导致编译器警告/错误,这比在生产中出现应用程序崩溃要好。

最新更新