Re[5]: Вопросы по reflection !!!
От: Аноним  
Дата: 31.08.06 17:45
Оценка:
Здравствуйте, 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(), и далее извлекать нужную информацию.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.