Get a Strongly-Typed Delegate to a Method or C# with Example



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); 

0 Comment's

Comment Form

Submit Comment