views:

417

answers:

1

I have a drop down list that is populated by inspecting a classes methods and including those that match a specific signature. The problem is in taken the selected item from the list and getting the delegate to call that method in the class. The first method works, but I cannot figure out part of the second.

For example,

        public delegate void MyDelegate(MyState state);

        public static MyDelegate GetMyDelegateFromString(string methodName)
        {
            switch (methodName)
            {
                case "CallMethodOne":
                    return MyFunctionsClass.CallMethodOne;
                case "CallMethodTwo":
                    return MyFunctionsClass.CallMethodTwo;
                default:
                    return MyFunctionsClass.CallMethodOne;
            }
        }

        public static MyDelegate GetMyDelegateFromStringReflection(string methodName)
        {
            MyDelegate function = MyFunctionsClass.CallMethodOne;

            Type inf = typeof(MyFunctionsClass);
            foreach (var method in inf.GetMethods())
            {
                if (method.Name == methodName)
                {
                    //function = method;
                    //how do I get the function to call?
                }
            }

            return function;
        }

How do I get the commented out section of the second method to work? How do I cast the MethodInfo into the delegate?

Thanks!

Edit: Here is the working solution.

        public static MyDelegate GetMyDelegateFromStringReflection(string methodName)
        {
            MyDelegate function = MyFunctionsClass.CallMethodOne;

            Type inf = typeof(MyFunctionsClass);
            foreach (var method in inf.GetMethods())
            {
                if (method.Name == methodName)
                {
                    function = (MyDelegate)Delegate.CreateDelegate(typeof(MyDelegate), method);
                }
            }

            return function;
        }
+5  A: 

You'll need to call some form of Delegate.CreateDelegate(), depending on whether the method in question is a static or instance method.

Nate Kohari
Thanks nkohari, worked out exactly as I need.
Ty