2010-05-14 3 views
2

Я хочу иметь метод расширения для XElement/XAttribute, который позволяет мне применять логику «ValueOrDefault» - возможно, с различными немного разными реализациями: ValueOrNull, ValueOrDefault, NumericValueOrDefault (который проверяет, значение является числовым), но я хочу ограничить эти методы, чтобы они могли работать только с ValueTypes или String (т. е. на самом деле не имеет смысла использовать какие-либо другие ссылочные типы. Возможно ли это сделать с одной реализацией каждого метода , или мне нужно будет иметь тот, где ограничение является «Структура», и где ограничение является «String» - если я объединяю Structure и 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 

ответ

2

Нет, нет никакого способа сделать «ИЛИ» в типе ограничений.

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

Смежные вопросы