Можно задать параметру тип ICollection, но тогда у переданной коллекции в методе не будет метода RemoveAt, который есть у интерфейса IList.
Мне посоветовали сделать свой интерфейс:
Public Interface IMyCollection
Inherits ICollection, IList, IEnumerable
End Interface
И указавать в качестве типа коллекции его, например:
Public Sub asdf(Collection As IMyCollection)
End Sub
Я так и сделал, приложение прекрасно скомпилировалось , но в процессе выполнения при вызове метода в который надо было передать коллекцию бросило исключение:
"Не удалось привести тип объекта "System.Windows.Forms.ToolStripItemCollection" к типу "IMyCollection"." Не посоветуте чего-нибудь?
ToolStripItemCollection реализует все эти три интерфейса, но моя IMyCollection ему почему-то не понравилось.
Здравствуйте, objMihail, Вы писали:
M>Можно задать параметру тип ICollection, но тогда у переданной коллекции в методе не будет метода RemoveAt, который есть у интерфейса IList.
M>Мне посоветовали сделать свой интерфейс: M>
M>И указавать в качестве типа коллекции его, например: M>
M>Public Sub asdf(Collection As IMyCollection)
M>End Sub
M>
M>Я так и сделал, приложение прекрасно скомпилировалось , но в процессе выполнения при вызове метода в который надо было передать коллекцию бросило исключение: M>"Не удалось привести тип объекта "System.Windows.Forms.ToolStripItemCollection" к типу "IMyCollection"." Не посоветуте чего-нибудь? M>ToolStripItemCollection реализует все эти три интерфейса, но моя IMyCollection ему почему-то не понравилось.
а если IList передать?
Re[2]: Как передать в метод коллекцию без указания типа?
Здравствуйте, alexey.kostylev, Вы писали:
AK>а если IList передать?
В большинстве случаев действительно можно обойтись одним IList, но бывают такие ситуации, когда нужно больше одного интерфейса. Хотелось бы знать, как поступать в этих случаях
Re[3]: Как передать в метод коллекцию без указания типа?
Здравствуйте, objMihail, Вы писали:
M>Здравствуйте, alexey.kostylev, Вы писали:
AK>>а если IList передать?
M>В большинстве случаев действительно можно обойтись одним IList, но бывают такие ситуации, когда нужно больше одного интерфейса. Хотелось бы знать, как поступать в этих случаях
ну если надо что-то нестандартное, то надо свой интерфейс передавать, что тут неясного.
Re[4]: Как передать в метод коллекцию без указания типа?
Здравствуйте, objMihail, Вы писали:
AK>>а если IList передать?
M>В большинстве случаев действительно можно обойтись одним IList, но бывают такие ситуации, когда нужно больше одного интерфейса. Хотелось бы знать, как поступать в этих случаях
Как вариант — generic-метод с условием where T: IInterface1, IInterface2, ...
Re: Как передать в метод коллекцию без указания типа?
M>Я так и сделал, приложение прекрасно скомпилировалось , но в процессе выполнения при вызове метода в который надо было передать коллекцию бросило исключение: M>"Не удалось привести тип объекта "System.Windows.Forms.ToolStripItemCollection" к типу "IMyCollection"." Не посоветуте чего-нибудь? M>ToolStripItemCollection реализует все эти три интерфейса, но моя IMyCollection ему почему-то не понравилось.
Все правильно ругнулся, ToolStripItemCollection не наследует IMyCollection.
Можно прикрутить утиную типизацию, на форуме уже не раз проскакивали темы как это сделать.
Re[5]: Как передать в метод коллекцию без указания типа?
Здравствуйте, objMihail, Вы писали:
M>Здравствуйте, alexey.kostylev, Вы писали:
AK>>ну если надо что-то нестандартное, то надо свой интерфейс передавать, что тут неясного.
M>Так вот я и передал
а ToolStripItemCollection реализует IMyCollection?
Re[4]: Как передать в метод коллекцию без указания типа?
Здравствуйте, Lloyd, Вы писали:
L>Как вариант — generic-метод с условием where T: IInterface1, IInterface2, ...
Спасибо, так у меня и было сделано до этого, всё прекрасно работало. Но вот чего-то руки зачесались сделать всё более грамотно как-то, думал это возможно. Странно прежде всего то, что ошибка появляется в процессе выполнения, а как же строгая типизация и т.д. и т.п.?
Re[6]: Как передать в метод коллекцию без указания типа?
M>Странно прежде всего то, что ошибка появляется в процессе выполнения, а как же строгая типизация и т.д. и т.п.?
Покажите как вызываете метод, сдается мне, что тип на момент компиляции неизвестен.
Re[5]: Как передать в метод коллекцию без указания типа?
Здравствуйте, objMihail, Вы писали:
M>Спасибо, так у меня и было сделано до этого, всё прекрасно работало. Но вот чего-то руки зачесались сделать всё более грамотно как-то, думал это возможно.
А что неграмотного в этом подходе?
M>Странно прежде всего то, что ошибка появляется в процессе выполнения, а как же строгая типизация и т.д. и т.п.?
Не верю. Покажите код.
Re[6]: Как передать в метод коллекцию без указания типа?
Здравствуйте, LF, Вы писали:
M>>Странно прежде всего то, что ошибка появляется в процессе выполнения, а как же строгая типизация и т.д. и т.п.? LF>Покажите как вызываете метод, сдается мне, что тип на момент компиляции неизвестен.
Не знаю, может тут и правда какие-то сложности в коде, этого достаточно?:
Public Sub MySub(ByVal Menu As MyContextMenuStrip)
Dim Items As ToolStripItemCollection = Menu.Items
' Ошибка о том, что невозможно преобразовать ToolStripItemCollection в IMyCollection возникает уже здесь (только в процессе выполнения).Dim Items2 IMyCollection = Items
End Sub
Re[7]: Как передать в метод коллекцию без указания типа?
Здравствуйте, objMihail, Вы писали:
M>Здравствуйте, LF, Вы писали:
M>>>Странно прежде всего то, что ошибка появляется в процессе выполнения, а как же строгая типизация и т.д. и т.п.? LF>>Покажите как вызываете метод, сдается мне, что тип на момент компиляции неизвестен.
M>Не знаю, может тут и правда какие-то сложности в коде, этого достаточно?:
M>
M> Public Sub MySub(ByVal Menu As MyContextMenuStrip)
M> Dim Items As ToolStripItemCollection = Menu.Items
M> ' Ошибка о том, что невозможно преобразовать ToolStripItemCollection в IMyCollection возникает уже здесь (только в процессе выполнения).
M> Dim Items2 IMyCollection = Items
M> End Sub
M>
ну так преобразование к интерфейсу в рантайме происходит... был бы дженерик с условием — был дизайн тайм
Re[8]: Как передать в метод коллекцию без указания типа?