Всем привет. Пытался тут в MSDN посмотреть описание EventInfo, но поскольку с английским худо все равно ни чего не понял, а вопросы остались! Изначально хотел посмотреть как считать параметры делегата, ну например delegate void MyEventHandler(int x). Для конструкторов и методов имеется метод GetParameters, однако для EventInfo.EventHandlerType, GetParameters() не нашлось.
Поэтому первый вопрос, как получить параметры делегата который представляет некоторое событие? Как я понимаю в сэмпле из MSDN именно этот случай и иллюстрируется. Посему еще два вопроса в теле программы ниже.
using System;
using System.Reflection;
public delegate void MyDelegate(double i);
public class MainClass
{
public event MyDelegate ev;
public void Fire(double i)
{
ev += new MyDelegate(this.Fire);
}
public static void Main()
{
//Что такое GetEvent("ev")? Что возвращает "событие" по имени?
Type deleg = typeof(MainClass).GetEvent("ev").EventHandlerType;
//Если GetMethod("Invoke") возвращает "метод" по имени, то где этот "Invoke"?
MethodInfo invoke = deleg.GetMethod("Invoke");
ParameterInfo[] pars = invoke.GetParameters();
foreach (ParameterInfo p in pars)
{
Console.WriteLine(p.ParameterType);
}
}
}
C> {
C> //Что такое GetEvent("ev")? Что возвращает "событие" по имени?
Да
C> Type deleg = typeof(MainClass).GetEvent("ev").EventHandlerType;
C> //Если GetMethod("Invoke") возвращает "метод" по имени, то где этот "Invoke"?
Это метод класса Delegate, т.е. твоего события ev, см. ev.Invoke()
C> MethodInfo invoke = deleg.GetMethod("Invoke");
C>}
C>
C>>{
C>> //Что такое GetEvent("ev")? Что возвращает "событие" по имени?
C> //Да
C>> Type deleg = typeof(MainClass).GetEvent("ev").EventHandlerType;
C>> //Если GetMethod("Invoke") возвращает "метод" по имени, то где этот "Invoke"?
C> //Это метод класса Delegate, т.е. твоего события ev, см. ev.Invoke()
C>> MethodInfo invoke = deleg.GetMethod("Invoke");
C>>}
C>>
Вызвать ev.Invoke() не удалось, есть ev.BeginInvoke() и ev.EndInvoke(). К тому же нет метода Invoke() и в описании класса Delegate(см. MSDN). А вообще Invoke() обычно используется для вызова методов, конструкторов и т.п. Так что вопрос висит !
Здравствуйте, Cinic, Вы писали:
C> К тому же нет метода Invoke() и в описании класса Delegate(см. MSDN).
Тем не менее, этот метод есть у всех типов-делегатов. Именно сигнатура этого метода и определяет количество и типы параметров, а также их имена.
Здравствуйте, Mab, Вы писали:
Mab>Здравствуйте, Cinic, Вы писали:
C>> К тому же нет метода Invoke() и в описании класса Delegate(см. MSDN). Mab>Тем не менее, этот метод есть у всех типов-делегатов. Именно сигнатура этого метода и определяет количество и типы параметров, а также их имена.
А по подробнее можно?
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(), и далее извлекать нужную информацию.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Cinic, Вы писали:
C>>Здравствуйте, Mab, Вы писали:
Mab>>>Здравствуйте, Cinic, Вы писали:
C>>>> К тому же нет метода Invoke() и в описании класса Delegate(см. MSDN). Mab>>>Тем не менее, этот метод есть у всех типов-делегатов. Именно сигнатура этого метода и определяет количество и типы параметров, а также их имена.
C>>А по подробнее можно?
А>Короче, объясняю на раз.
А>Метода Invoke() действительно нет у базовых классов делегатов — ни у Delegate, ни у MulticastDelegate. Он (и ещё 3 других метода) добавляются компилятором. Делегат — это на самом деле просто ещё один класс, производный от MulticastDelegate (я не видел делегатов производных от Delegate). Когда на C# вы пишете что-то типа
А>
А>, компилятор создаёт класс MyDelegate, в котором помимо всех членов MulticastDelegate также будут определены ещё 4 метода и среди них как раз Invoke(), который и используется для вызова делегата. Метод Invoke() содержит все те же параметры, что и были указаны при объявлении делегата (или при объявлении события в Visual Basic .NET, в этом случае делегат создаётся компилятором неявно вложенным в класс, где событие объявлено).
А>У вышеуказанного делегата будет создан метод Invoke() вида
А>
А>public bool Invoke (int arg1, string arg2);
А>
А>Итак, чтобы получить список параметров делегата, а также возвращаемое значение, — достаточно получить объект System.Type для типа делегата, далее получить метод Invoke(), и далее извлекать нужную информацию.
Вопрос, а где вы все это прочитали. Я уже не первый раз сталкиваюсь с тем, что то что должно быть написано — не написано. Не посоветуете книжонку? Что нибудь типа "Язык программирования С++" Бьерна Страуструпа. Вот там все было!
Здравствуйте, Cinic, Вы писали:
C>Вопрос, а где вы все это прочитали. Я уже не первый раз сталкиваюсь с тем, что то что должно быть написано — не написано. Не посоветуете книжонку? Что нибудь типа "Язык программирования С++" Бьерна Страуструпа. Вот там все было!
Видите ли, книжки я читал только в самом начале своей карьеры программиста, поэтому посоветовать ничего не могу.
А откуда узнал? В данном случае я диззасемблировал готовую .NET-программу и увидел что сделал компилятор.
Диззасмить можно с помощью .NET Reflector. IMHO, самая крутая прога для этого.