How to pass a method received by reflection in C # to a method that accepts a method as a delegate?

I understand that the name needs to be read more than once to understand ... :)

I applied a special attribute that I apply to methods in my classes. all methods apply the attribute to the same signature, and so I defined a delegate for them:

public delegate void TestMethod(); 

I have a structure that accepts this delegate as a parameter

 struct TestMetaData { TestMethod method; string testName; } 

Is it possible to get a method from a reflection that has a custom attribute and pass it to the structure in the method member?

I know that you can call it, but I think that thinking will not give me the actual method from my class, which I can apply to the TestMethod delegate.

+6
reflection methods c # attributes delegates
source share
4 answers

Once you have MethodInfo via Reflection, you can use Delegate.CreateDelegate to turn it into a delegate, and then use Reflection to set it directly to the property / field of your structure.

+11
source share

You can create a delegate that calls your reflection 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(); } } 
+1
source share

You also need a suitable delegate for your ad.

0
source share

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(); } } 
0
source share

All Articles