Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Cinic, Вы писали:
C>>Здравствуйте, Mab, Вы писали:
Mab>>>Здравствуйте, Cinic, Вы писали:
C>>>> К тому же нет метода Invoke() и в описании класса Delegate(см. MSDN).
Mab>>>Тем не менее, этот метод есть у всех типов-делегатов. Именно сигнатура этого метода и определяет количество и типы параметров, а также их имена.
C>>А по подробнее можно?
А>Короче, объясняю на раз.
А>Метода Invoke() действительно нет у базовых классов делегатов — ни у Delegate, ни у MulticastDelegate. Он (и ещё 3 других метода) добавляются компилятором. Делегат — это на самом деле просто ещё один класс, производный от MulticastDelegate (я не видел делегатов производных от Delegate). Когда на C# вы пишете что-то типа
А>А>public delegate bool MyDelegate (int arg1, string arg2);
А>
А>, компилятор создаёт класс MyDelegate, в котором помимо всех членов MulticastDelegate также будут определены ещё 4 метода и среди них как раз Invoke(), который и используется для вызова делегата. Метод Invoke() содержит все те же параметры, что и были указаны при объявлении делегата (или при объявлении события в Visual Basic .NET, в этом случае делегат создаётся компилятором неявно вложенным в класс, где событие объявлено).
А>У вышеуказанного делегата будет создан метод Invoke() вида
А>А>public bool Invoke (int arg1, string arg2);
А>
А>Итак, чтобы получить список параметров делегата, а также возвращаемое значение, — достаточно получить объект System.Type для типа делегата, далее получить метод Invoke(), и далее извлекать нужную информацию.
Вопрос, а где вы все это прочитали. Я уже не первый раз сталкиваюсь с тем, что то что должно быть написано — не написано. Не посоветуете книжонку? Что нибудь типа "Язык программирования С++" Бьерна Страуструпа. Вот там все было!