• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы MozgOFF215
  • Дата начала
M

MozgOFF215

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

LuMee

Вы не ту перегрузку CreateDelegate используете. Нужно как-то так:
Код:
obj._funGetTxt = (MyObj.DelString)Delegate.CreateDelegate(typeof(MyObj.DelString), this, "PostString");
 
M

MozgOFF215

Спасибо, так работает. И рефлексия здесь не нужна...
 
V

VladimirBorschenko

Просто нужно чтобы количество и типы аргументов метода, а также тип возвращаемого значения совпадал с объявленным типом делегата
public delegate string DelString(); то есть нужно цеплять паблик метод без аргументов что возвращает string
Вот можно здесь посмотреть, тут все подробно расписано
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!