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

MozgOFF215

New Member
05.07.2009
3
0
#1
Необходимо в поле делегата экземпляра класса задавать привязку к методу не обычным путем, а через строковое название метода.
Я применил извлечение 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]
 

LuMee

Well-Known Member
02.05.2006
477
0
#2
Вы не ту перегрузку CreateDelegate используете. Нужно как-то так:
Код:
obj._funGetTxt = (MyObj.DelString)Delegate.CreateDelegate(typeof(MyObj.DelString), this, "PostString");
 
22.07.2013
1
0
#5
Просто нужно чтобы количество и типы аргументов метода, а также тип возвращаемого значения совпадал с объявленным типом делегата
public delegate string DelString(); то есть нужно цеплять паблик метод без аргументов что возвращает string
Вот можно здесь посмотреть, тут все подробно расписано
http://edu.cbsystematics.com/video/ru/less...00-f8d78ef0de59