c# - Creando delegado de MethodInfo
delegates attributes (2)
Está intentando crear un delegado desde un método de instancia , pero no está pasando un objetivo.
Podrías usar:
Delegate.CreateDelegate(typeof(TestDelagate), this, method);
... o podrías hacer tu método estático.
(Si necesita hacer frente a ambos tipos de métodos, deberá hacerlo condicionalmente, o pasar el null
como el argumento central).
Actualmente me encuentro con un problema al intentar crear delegados de MethodInfo
. Mi objetivo general es examinar los métodos en una clase y crear delegados para aquellos marcados con un determinado atributo. Estoy intentando usar CreateDelegate
pero CreateDelegate
el siguiente error.
No se puede enlazar con el método de destino porque su firma o transparencia de seguridad no es compatible con la del tipo de delegado.
Aqui esta mi codigo
public class TestClass
{
public delegate void TestDelagate(string test);
private List<TestDelagate> delagates = new List<TestDelagate>();
public TestClass()
{
foreach (MethodInfo method in this.GetType().GetMethods())
{
if (TestAttribute.IsTest(method))
{
TestDelegate newDelegate = (TestDelagate)Delegate.CreateDelegate(typeof(TestDelagate), method);
delegates.Add(newDelegate);
}
}
}
[Test]
public void TestFunction(string test)
{
}
}
public class TestAttribute : Attribute
{
public static bool IsTest(MemberInfo member)
{
bool isTestAttribute = false;
foreach (object attribute in member.GetCustomAttributes(true))
{
if (attribute is TestAttribute)
isTestAttribute = true;
}
return isTestAttribute;
}
}
Necesita una firma diferente para el delegado, si no tiene un objetivo. El objetivo debe ser pasado como primer argumento.
public class TestClass
{
public delegate void TestDelagate(TestClass instance, string test);
private List<TestDelagate> delagates = new List<TestDelagate>();
public TestClass()
{
foreach (MethodInfo method in this.GetType().GetMethods())
{
if (TestAttribute.IsTest(method))
{
TestDelegate newDelegate = (TestDelagate)Delegate.CreateDelegate(typeof(TestDelagate), null, method);
delegates.Add(newDelegate);
//Invocation:
newDelegate.DynamicInvoke(this, "hello");
}
}
}
[Test]
public void TestFunction(string test)
{
}
}