Как передать в метод коллекцию без указания типа?
От: objMihail Россия  
Дата: 23.09.10 10:47
Оценка:
Можно задать параметру тип 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 ему почему-то не понравилось.
интерфейсы
Re: Как передать в метод коллекцию без указания типа?
От: alexey.kostylev Новая Зеландия http://alexeykostylev.livejournal.com/
Дата: 23.09.10 10:56
Оценка:
Здравствуйте, objMihail, Вы писали:

M>Можно задать параметру тип ICollection, но тогда у переданной коллекции в методе не будет метода RemoveAt, который есть у интерфейса IList.


M>Мне посоветовали сделать свой интерфейс:

M>
M>Public Interface IMyCollection
M>    Inherits ICollection, IList, IEnumerable
M>End Interface
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]: Как передать в метод коллекцию без указания типа?
От: objMihail Россия  
Дата: 23.09.10 11:00
Оценка:
Здравствуйте, alexey.kostylev, Вы писали:

AK>а если IList передать?


В большинстве случаев действительно можно обойтись одним IList, но бывают такие ситуации, когда нужно больше одного интерфейса. Хотелось бы знать, как поступать в этих случаях
Re[3]: Как передать в метод коллекцию без указания типа?
От: alexey.kostylev Новая Зеландия http://alexeykostylev.livejournal.com/
Дата: 23.09.10 11:01
Оценка:
Здравствуйте, objMihail, Вы писали:

M>Здравствуйте, alexey.kostylev, Вы писали:


AK>>а если IList передать?


M>В большинстве случаев действительно можно обойтись одним IList, но бывают такие ситуации, когда нужно больше одного интерфейса. Хотелось бы знать, как поступать в этих случаях


ну если надо что-то нестандартное, то надо свой интерфейс передавать, что тут неясного.
Re[4]: Как передать в метод коллекцию без указания типа?
От: objMihail Россия  
Дата: 23.09.10 11:03
Оценка:
Здравствуйте, alexey.kostylev, Вы писали:

AK>ну если надо что-то нестандартное, то надо свой интерфейс передавать, что тут неясного.


Так вот я и передал
Re[3]: Как передать в метод коллекцию без указания типа?
От: Lloyd Россия  
Дата: 23.09.10 11:03
Оценка:
Здравствуйте, objMihail, Вы писали:

AK>>а если IList передать?


M>В большинстве случаев действительно можно обойтись одним IList, но бывают такие ситуации, когда нужно больше одного интерфейса. Хотелось бы знать, как поступать в этих случаях


Как вариант — generic-метод с условием where T: IInterface1, IInterface2, ...
Re: Как передать в метод коллекцию без указания типа?
От: LF  
Дата: 23.09.10 11:04
Оценка:
M>Я так и сделал, приложение прекрасно скомпилировалось , но в процессе выполнения при вызове метода в который надо было передать коллекцию бросило исключение:
M>"Не удалось привести тип объекта "System.Windows.Forms.ToolStripItemCollection" к типу "IMyCollection"." Не посоветуте чего-нибудь?
M>ToolStripItemCollection реализует все эти три интерфейса, но моя IMyCollection ему почему-то не понравилось.
Все правильно ругнулся, ToolStripItemCollection не наследует IMyCollection.
Можно прикрутить утиную типизацию, на форуме уже не раз проскакивали темы как это сделать.
Re[5]: Как передать в метод коллекцию без указания типа?
От: alexey.kostylev Новая Зеландия http://alexeykostylev.livejournal.com/
Дата: 23.09.10 11:04
Оценка:
Здравствуйте, objMihail, Вы писали:

M>Здравствуйте, alexey.kostylev, Вы писали:


AK>>ну если надо что-то нестандартное, то надо свой интерфейс передавать, что тут неясного.


M>Так вот я и передал


а ToolStripItemCollection реализует IMyCollection?
Re[4]: Как передать в метод коллекцию без указания типа?
От: objMihail Россия  
Дата: 23.09.10 11:05
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Как вариант — generic-метод с условием where T: IInterface1, IInterface2, ...


Спасибо, так у меня и было сделано до этого, всё прекрасно работало. Но вот чего-то руки зачесались сделать всё более грамотно как-то, думал это возможно. Странно прежде всего то, что ошибка появляется в процессе выполнения, а как же строгая типизация и т.д. и т.п.?
Re[6]: Как передать в метод коллекцию без указания типа?
От: objMihail Россия  
Дата: 23.09.10 11:06
Оценка: :))
Здравствуйте, alexey.kostylev, Вы писали:

AK>а ToolStripItemCollection реализует IMyCollection?


Нет, накосячили в Microsoft.
Re[7]: Как передать в метод коллекцию без указания типа?
От: alexey.kostylev Новая Зеландия http://alexeykostylev.livejournal.com/
Дата: 23.09.10 11:08
Оценка:
Здравствуйте, objMihail, Вы писали:

M>Здравствуйте, alexey.kostylev, Вы писали:


AK>>а ToolStripItemCollection реализует IMyCollection?


M>Нет, накосячили в Microsoft.


Это да... ребята из МС просто безответственно к работе относятся
Re[5]: Как передать в метод коллекцию без указания типа?
От: LF  
Дата: 23.09.10 11:12
Оценка:
M>Странно прежде всего то, что ошибка появляется в процессе выполнения, а как же строгая типизация и т.д. и т.п.?
Покажите как вызываете метод, сдается мне, что тип на момент компиляции неизвестен.
Re[5]: Как передать в метод коллекцию без указания типа?
От: Lloyd Россия  
Дата: 23.09.10 11:12
Оценка:
Здравствуйте, objMihail, Вы писали:

M>Спасибо, так у меня и было сделано до этого, всё прекрасно работало. Но вот чего-то руки зачесались сделать всё более грамотно как-то, думал это возможно.


А что неграмотного в этом подходе?

M>Странно прежде всего то, что ошибка появляется в процессе выполнения, а как же строгая типизация и т.д. и т.п.?


Не верю. Покажите код.
Re[6]: Как передать в метод коллекцию без указания типа?
От: objMihail Россия  
Дата: 23.09.10 11:45
Оценка:
Здравствуйте, 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]: Как передать в метод коллекцию без указания типа?
От: alexey.kostylev Новая Зеландия http://alexeykostylev.livejournal.com/
Дата: 23.09.10 11:48
Оценка:
Здравствуйте, 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]: Как передать в метод коллекцию без указания типа?
От: objMihail Россия  
Дата: 23.09.10 11:50
Оценка:
Здравствуйте, alexey.kostylev, Вы писали:

AK>ну так преобразование к интерфейсу в рантайме происходит... был бы дженерик с условием — был дизайн тайм


Ясно, спасибо, теперь буду знать, буду использовать только дженерики.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.