I want to get an action delegate from a MethodInfo object. Is this possible?
How can I create an Action delegate from MethodInfo?
Asked Answered
// Static method
Action action = (Action) Delegate.CreateDelegate(typeof(Action), method);
// Instance method (on "target")
Action action = (Action) Delegate.CreateDelegate(typeof(Action), target, method);
For an Action<T>
etc, just specify the appropriate delegate type everywhere.
In .NET Core, Delegate.CreateDelegate
doesn't exist, but MethodInfo.CreateDelegate
does:
// Static method
Action action = (Action) method.CreateDelegate(typeof(Action));
// Instance method (on "target")
Action action = (Action) method.CreateDelegate(typeof(Action), target);
Upvoted. How to apply this to DataEventArgs<T> ? #33376826 –
Nictitate
Delegate.CreateDelegate
does not appear to be available in .Net Core. Any ideas there? –
Galer @IAbstract: Interesting - I hadn't spotted that. You can call
MethodInfo.CreateDelegate
instead. (Just tried it, and it worked fine.) –
Morphine @JonSkeet: yeah, actually found that and appreciate adding to answer. +1 for completeness!!! –
Galer
@JonSkeet [side-bar & food for thought] re: Delegate vs MethodInfo in
try-catch
blocks. I discovered the much perturbing failure of try-catch blocks when invoking a MethodInfo (e.g., obtained via reflection). However, if a delegate is created from the MethodInfo and cast to a Delegate
sub-class - i.e., Action, Func - and executed in a try-catch block, any exceptions are caught as expected. –
Galer @IAbstract: That sounds very odd. Possibly ask about it in a new question? –
Morphine
Can a parameter be passed into this delegate? –
Acrylonitrile
@DouglasGaskell: Not an
Action
, no. If you want a delegate with an argument, pick a delegate with a signature matching what you want. –
Morphine This seems to work on top of John's advice too:
public static class GenericDelegateFactory
{
public static object CreateDelegateByParameter(Type parameterType, object target, MethodInfo method) {
var createDelegate = typeof(GenericDelegateFactory).GetMethod("CreateDelegate")
.MakeGenericMethod(parameterType);
var del = createDelegate.Invoke(null, new object[] { target, method });
return del;
}
public static Action<TEvent> CreateDelegate<TEvent>(object target, MethodInfo method)
{
var del = (Action<TEvent>)Delegate.CreateDelegate(typeof(Action<TEvent>), target, method);
return del;
}
}
© 2022 - 2024 — McMap. All rights reserved.