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]
Я применил извлечение 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]