gpt4 book ai didi

c# - 禁止某些类型的通用类型约束?

转载 作者:行者123 更新时间:2023-11-30 19:43:16 25 4
gpt4 key购买 nike

我想创建一个通用方法:

MvcHtmlString MyMethod<T>(this HtmlHelper html, string title, IEnumerable<T> value)

我的代码中有很多变量,它们是 List<T> , IEnumerable<T> , xxxCollection , T[]等...此方法还有一个重载,它将采用不可枚举的值。是否可以在类型参数约束中禁止特定类(如 string )?

我已经创建了一个这样的重载:

MvcHtmlString MyMethod<T>(this HtmlHelper html, string title, object value)

此重载适用于处理单个值,但处理值集合需要稍微不同的实现。然而,string工具 IEnumerable所以我所有的字符串变量都将被发送到错误的重载,除非我可以告诉编译器它们应该被排除在外。

最佳答案

没有。 Generic type parameters约束只能执行约束而不是约束。

运行时类型检查可能是可行的方法:

MvcHtmlString MyMethod<T>(this HtmlHelper html, string title, IEnumerable<T> value)
{
if (typeof(T) == typeof(string))
{
throw new IllegalOperationException(...);
}
}

如果您要传递给您的方法的所有类型都继承自同一个基类,或实现同一个接口(interface),您可以使用 jrummell 的单一约束建议来强制继承。

虽然它更不优雅,但如果您想支持异构类型,另一种方法是提供足够的重载来处理您的特定用例:

// supports int, float, DateTime, etc.
MvcHtmlString MyMethod(this HtmlHelper html, string title, IEnumerable<int> value)
MvcHtmlString MyMethod(this HtmlHelper html, string title, IEnumerable<float> value)
MvcHtmlString MyMethod(this HtmlHelper html, string title, IEnumerable<DateTime> value)

// supports implementations of MyInterface
MvcHtmlString MyMethod(this HtmlHelper html, string title, IEnumerable<IMyInterface> value)

在上面的示例中,您将无法调用 MyMethod<string>因为它不满足任何提供的类型约束。请注意,您不能为此使用类型约束,因为它们不是方法签名的一部分。

关于c# - 禁止某些类型的通用类型约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15621454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com