asp.net - прохождение общих списков - PullRequest
3 голосов
/ 06 мая 2009

У меня есть служебный класс, который принимает общий список в качестве параметра.

Код выглядит так:

Function DoStuff(collection as Object, elt as Object)
   ...
   collection.Add(elt)
   ...
End Function

Это называется с:

DoStuff( List(Of Foo), new Foo() )
DoStuff( List(Of Bar), new Bar() )

Существует около десятка различных типов.

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

Я пробовал разные способы передачи в collection и elt (Foo и Bar оба расширяют базовый класс), но, похоже, не могу найти «правильный» способ сделать это.

Идеи

Ответы [ 3 ]

7 голосов
/ 06 мая 2009

Я думаю, вы ищете что-то вроде этого.

Public Sub DoStuff(Of T)(collection As List(Of T), elt As T)
    ...
    collection.Add(elt)
    ...
End Function
3 голосов
/ 02 июня 2009

Ответы от womp и Qua, я думаю, правильные, однако, если все ваши 12 типов унаследованы от некоторого общего базового класса (как предполагает ваш оригинальный вопрос), вы можете написать метод так, чтобы он работал с вашими типами, и только ваши типы как таковые:

Public Sub DoStuff(Of T As YourBaseClass)(collection As List(Of T), elt As T)
    ...
    collection.Add(elt)
    ...
End Sub

Этот метод работает только для типов, которые наследуются от YourBaseClass.

1 голос
/ 06 мая 2009

Вы всегда должны стремиться создавать / использовать строго типизированный код. Представьте, что произойдет, если целое число будет передано как объект collection - вам придется вручную проверить тип переменной. Хуже того, пользователь вашего метода должен будет посмотреть в документации, какой объект нужен вашему методу в качестве первого параметра.

Вы должны следовать подходу, предложенному womp , или, что еще лучше, вы должны заставить свой параметр требовать объект, который расширяет общий интерфейс коллекции, ICollection (Of T):

Public Function DoStuff(Of T)(collection As ICollection(Of T), elt As T) As stuff
...
collection.Add(elt)
...
End Function

, поскольку это позволило бы пользователю метода передавать не только списки, но и все другие классы, которые наследуют интерфейс ICollection (Of T) (synchronizedCollection, HashSet, LinkedList или пользовательские классы и т. Д.), Который действительно является мощью оо программирование.

...