Question

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 actual method from my class that i can cast to the TestMethod delegate.

Was it helpful?

Solution

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.

OTHER TIPS

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(); }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top