Ограничить универсальный метод расширения базовыми типами и строкой - PullRequest
2 голосов
/ 14 мая 2010

Я хочу иметь метод расширения для 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 Ответ

3 голосов
/ 14 мая 2010

Нет, нет никакого способа сделать "или" в ограничениях типов.

Мне кажется, что вы действительно хотите одну перегрузку, которая является общей с ограничением типа значения, и одну, которая не является универсальной, но имеет строковый параметр. Вы все равно не можете указать ограничение типа для запечатанного класса.

...