How can I pass a method acquired by reflection in C# to a method that accepts the method as a delegate?
I realize the title needs to be read more than once for understanding ... :)
I implemented a custom attribute that i apply to methods in my classes. all methods i apply the attribute to have the same signature and thus i defined a delegate for them:
public delegate void TestMethod();
I have a struct that accepts that delegate as a parameter
struct TestMetaData
{
TestMethod method;
string testName;
}
Is it possible to get from reflection a method that has the custom attribute and pass it to the struct into the 'method' member ?
I know you can invoke it but i think reflection won't give me the actua开发者_如何学JAVAl method from my class that i can cast to the TestMethod delegate.
Once you have the MethodInfo via Reflection, you can use Delegate.CreateDelegate to turn it into a Delegate, and then use Reflection to set this directly to the property/field of your struct.
You can create a delegate that calls your reflected method at runtime using Invoke, or Delegate.CreateDelegate.
Example:
using System;
class Program
{
public delegate void TestMethod();
public class Test
{
public void MyMethod()
{
Console.WriteLine("Test");
}
}
static void Main(string[] args)
{
Test t = new Test();
Type test = t.GetType();
var reflectedMethod = test.GetMethod("MyMethod");
TestMethod method = (TestMethod)Delegate.CreateDelegate(typeof(TestMethod), t, reflectedMethod);
method();
}
}
Also you need suitable delegate to be already declared
As an example:
using System;
using System.Linq;
using System.Reflection;
public delegate void TestMethod();
class FooAttribute : Attribute { }
static class Program
{
static void Main() {
// find by attribute
MethodInfo method =
(from m in typeof(Program).GetMethods()
where Attribute.IsDefined(m, typeof(FooAttribute))
select m).First();
TestMethod del = (TestMethod)Delegate.CreateDelegate(
typeof(TestMethod), method);
TestMetaData tmd = new TestMetaData(del, method.Name);
tmd.Bar();
}
[Foo]
public static void TestImpl() {
Console.WriteLine("hi");
}
}
struct TestMetaData
{
public TestMetaData(TestMethod method, string name)
{
this.method = method;
this.testName = name;
}
readonly TestMethod method;
readonly string testName;
public void Bar() { method(); }
}
精彩评论