Привязка Метода К Делегату Через Рефлексию

Тема в разделе ".NET - Общие вопросы по языкам", создана пользователем MozgOFF215, 11 май 2013.

  1. MozgOFF215

    MozgOFF215 New Member

    Регистрация:
    5 июл 2009
    Сообщения:
    3
    Симпатии:
    0
    Необходимо в поле делегата экземпляра класса задавать привязку к методу не обычным путем, а через строковое название метода.
    Я применил извлечение MethodInfo нужного метода при помощи рефлексии и создал новый делегат при помощи Delegate.CreateDelegate.
    Все вроде правильно, но при выполнении возникает исключение на строке с CreateDelegate "Не удается привязать целевой метод, поскольку его сигнатура или прозрачность безопасности несовместима с сигнатурой или прозрачностью безопасности типа делегата."
    О чем это исключение не могу понять. Может можно каким-то другим способом решить проблему?
    (VisualStudio2012, FW4.0)

    <!--shcode--><pre><code class='# auto'>using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace Example1
    {
    class Program
    {
    static void Main(string[] args)
    {
    GoProgramm go = new GoProgramm();
    go.Go();
    Console.ReadLine();
    }
    }
    class MyObj
    {
    public delegate string DelString();
    public DelString _funGetTxt;
    public void WriteString()
    {
    if (_funGetTxt != null) Console.WriteLine(_funGetTxt());
    else Console.WriteLine("_funGetTxt==null");
    }
    }
    class GoProgramm
    {
    public void Go()
    {
    MyObj obj = new MyObj();

    //obj._funGetTxt = PostString; // это обычная привязка к делегату

    // здесь привязка через рефлексию по названию метода
    Type type = typeof(MyObj.DelString);
    System.Reflection.MethodInfo mi = this.GetType().GetMethod("PostString");
    obj._funGetTxt = (MyObj.DelString)Delegate.CreateDelegate(type, mi);

    obj.WriteString(); // в консоли появится строка "some string"
    }
    public string PostString()
    {
    return "some string";
    }
    }
    }[/CODE]
     
  2. LuMee

    LuMee Well-Known Member

    Регистрация:
    2 май 2006
    Сообщения:
    477
    Симпатии:
    0
    Вы не ту перегрузку CreateDelegate используете. Нужно как-то так:
    Код (Text):
    obj._funGetTxt = (MyObj.DelString)Delegate.CreateDelegate(typeof(MyObj.DelString), this, "PostString");
     
  3. MozgOFF215

    MozgOFF215 New Member

    Регистрация:
    5 июл 2009
    Сообщения:
    3
    Симпатии:
    0
    Спасибо, так работает. И рефлексия здесь не нужна...
     
  4. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    18
    а чтож тогда это?
     
  5. VladimirBorschenko

    VladimirBorschenko New Member

    Регистрация:
    22 июл 2013
    Сообщения:
    1
    Симпатии:
    0
    Просто нужно чтобы количество и типы аргументов метода, а также тип возвращаемого значения совпадал с объявленным типом делегата
    public delegate string DelString(); то есть нужно цеплять паблик метод без аргументов что возвращает string
    Вот можно здесь посмотреть, тут все подробно расписано
    http://edu.cbsystematics.com/video/ru/less...00-f8d78ef0de59
     
Загрузка...

Поделиться этой страницей