将泛型扩展方法约束为基类型和字符串

时间:2010-05-14 00:44:23

标签: 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

1 个答案:

答案 0 :(得分:3)

不,没有办法在类型约束中执行“或”。

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