Здравствуйте, 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(), и далее извлекать нужную информацию.