Вопросы по reflection !!!
От: Cinic  
Дата: 31.08.06 16:42
Оценка:
Всем привет. Пытался тут в 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);
        }
    }
}
Re: Вопросы по reflection !!!
От: Chardex Россия  
Дата: 31.08.06 16:52
Оценка:
C>

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>
Re[2]: Вопросы по reflection !!!
От: Cinic  
Дата: 31.08.06 17:02
Оценка:
Здравствуйте, Chardex, Вы писали:

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() обычно используется для вызова методов, конструкторов и т.п. Так что вопрос висит !
Re[3]: Вопросы по reflection !!!
От: Mab Россия http://shade.msu.ru/~mab
Дата: 31.08.06 17:09
Оценка: 3 (1)
Здравствуйте, Cinic, Вы писали:

C> К тому же нет метода Invoke() и в описании класса Delegate(см. MSDN).

Тем не менее, этот метод есть у всех типов-делегатов. Именно сигнатура этого метода и определяет количество и типы параметров, а также их имена.
Re[4]: Вопросы по reflection !!!
От: Cinic  
Дата: 31.08.06 17:14
Оценка:
Здравствуйте, 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(), и далее извлекать нужную информацию.
Re[6]: Вопросы по reflection !!!
От: Cinic  
Дата: 31.08.06 18:31
Оценка:
Здравствуйте, Аноним, Вы писали:

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


Вопрос, а где вы все это прочитали. Я уже не первый раз сталкиваюсь с тем, что то что должно быть написано — не написано. Не посоветуете книжонку? Что нибудь типа "Язык программирования С++" Бьерна Страуструпа. Вот там все было!
Re[7]: Вопросы по reflection !!!
От: nikov США http://www.linkedin.com/in/nikov
Дата: 01.09.06 05:20
Оценка:
Здравствуйте, Cinic, Вы писали:

C>Вопрос, а где вы все это прочитали.


Довольно продробно написано в статье Делегаты и события
Автор(ы): Алексей Дубовцев
Дата: 26.03.2005
Глава из книги Алексея Дубовцева “Microsoft .NET в подлиннике”, посвященная описанию работы с делегатами в .NET. Подробно разбираются многие аспекты работы с делегатами и на наглядных примерах раскрываются многие особенности использовании этой возможности.

.
Re[7]: Вопросы по reflection !!!
От: Аноним  
Дата: 01.09.06 08:05
Оценка:
Здравствуйте, Cinic, Вы писали:

C>Вопрос, а где вы все это прочитали. Я уже не первый раз сталкиваюсь с тем, что то что должно быть написано — не написано. Не посоветуете книжонку? Что нибудь типа "Язык программирования С++" Бьерна Страуструпа. Вот там все было!


Видите ли, книжки я читал только в самом начале своей карьеры программиста, поэтому посоветовать ничего не могу.
А откуда узнал? В данном случае я диззасемблировал готовую .NET-программу и увидел что сделал компилятор.
Диззасмить можно с помощью .NET Reflector. IMHO, самая крутая прога для этого.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.