Get a Strongly-Typed Delegate to a Method or C# with Example
Property via Reflection When performance is a concern, invoking a method via reflection (i.e. via the MethodInfo.Invoke method) is not ideal. However, it is relatively straightforward to obtain a more performant strongly-typed delegate using the Delegate.CreateDelegate function. The performance penalty for using reflection is incurred only during the delegate-creation process. Once the delegate is created, there is little-to-no performance penalty for invoking it: // Get a MethodInfo for the Math.Max(int, int) method... var maxMethod = typeof(Math).GetMethod("Max", new Type[] { typeof(int), typeof(int) }); // Now get a strongly-typed delegate for Math.Max(int, int)... var stronglyTypedDelegate = (Func)Delegate.CreateDelegate(typeof(Func), null, maxMethod); // Invoke the Math.Max(int, int) method using the strongly-typed delegate... Console.WriteLine("Max of 3 and 5 is: {0}", stronglyTypedDelegate(3, 5)); This technique can be extended to properties as well. If we have a class named MyClass with an int property named MyIntProperty, the code to get a strongly-typed getter would be (the following example assumes 'target' is a valid instance of MyClass): // Get a MethodInfo for the MyClass.MyIntProperty getter... var theProperty = typeof(MyClass).GetProperty("MyIntProperty"); var theGetter = theProperty.GetGetMethod(); // Now get a strongly-typed delegate for MyIntProperty that can be executed against any MyClass instance... var stronglyTypedGetter = (Func)Delegate.CreateDelegate(typeof(Func), theGetter); // Invoke the MyIntProperty getter against MyClass instance 'target'... Console.WriteLine("target.MyIntProperty is: {0}", stronglyTypedGetter(target)); ...and the same can be done for the setter: // Get a MethodInfo for the MyClass.MyIntProperty setter... var theProperty = typeof(MyClass).GetProperty("MyIntProperty"); var theSetter = theProperty.GetSetMethod(); // Now get a strongly-typed delegate for MyIntProperty that can be executed against any MyClass instance... var stronglyTypedSetter = (Action)Delegate.CreateDelegate(typeof(Action), theSetter); // Set MyIntProperty to 5... stronglyTypedSetter(target, 5);