extension-methods - 将泛型扩展方法限制为基本类型和字符串

标签 extension-methods generics constraints

我想要一个 XElement/XAttribute 的扩展方法,它允许我应用“ValueOrDefault”逻辑 - 可能具有各种略有不同的实现:ValueOrNull、ValueOrDefault、NumericValueOrDefault(验证值是否为数字),但我想要限制这些方法,使它们只能与 ValueTypes 或 String 一起使用(即,使用任何其他引用类型实际上没有意义。是否可以使用每种方法的一个实现来做到这一点,或者我必须有一个实现约束是“结构”,约束是“字符串” - 如果我在通用约束中组合结构和字符串,则会收到错误: “结构”约束和特定类类型约束不能组合。

当前方法实现的示例如下:

    <Extension()> _
    Public Function ValueOrDefault(Of T As {Structure})(ByVal xe As XElement, ByVal defaultValue As T) As T
        If xe Is Nothing or xe.Value = "" Then
            Return defaultValue
        End If

        Return CType(Convert.ChangeType(xe.Value, GetType(T)), T)
    End Function

最佳答案

不,无法在类型约束中执行“或”操作。

在我看来,您确实想要一个具有值类型约束的泛型重载,以及一个非泛型但具有字符串参数的重载。无论如何,您实际上无法指定密封类的类型约束。

关于extension-methods - 将泛型扩展方法限制为基本类型和字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2831177/

相关文章:

extension-methods - Kotlin 内联方法不可见,除非扩展类

.net - 使用 SustainSys Saml2 扩展方法 ToHttpRequestData 编译错误 "call is ambiguous"

c# - 如何为枚举类型参数创建扩展方法?

java - Java 是否支持类似 Swift 的类扩展?

c++ - 如何保证一个类扩展了 C++ 中的实现?

c# - 如何声明一个泛型类型的泛型约束

generics - TypeScript "extends"通用约束

java - 的用法?扩展 Java 泛型中的任何对象

sql - 将表约束从 select * 复制到

ios - UITextField 不响应 iOS8 中的触摸?