C# Language Obtenir un délégué fortement typé sur une méthode ou une propriété via la réflexion


Exemple

Lorsque les performances MethodInfo.Invoke problème, l'appel d'une méthode via la réflexion (c'est-à-dire via la méthode MethodInfo.Invoke ) n'est pas idéal. Cependant, il est relativement simple d'obtenir un délégué plus typé et plus performant à l'aide de la fonction Delegate.CreateDelegate . La pénalité de performance liée à l'utilisation de la réflexion ne survient que pendant le processus de création de délégué. Une fois le délégué créé, il y a peu ou pas de performance pour l'invoquer:

// 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<int, int, int>)Delegate.CreateDelegate(typeof(Func<int, int, int>), 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));

Cette technique peut également être étendue aux propriétés. Si nous avons une classe nommée MyClass avec une propriété int nommée MyIntProperty , le code pour obtenir un getter fortement typé serait (l'exemple suivant suppose que 'target' est une instance valide de 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<MyClass, int>)Delegate.CreateDelegate(typeof(Func<MyClass, int>), theGetter);
// Invoke the MyIntProperty getter against MyClass instance 'target'...
Console.WriteLine("target.MyIntProperty is: {0}", stronglyTypedGetter(target));

... et la même chose peut être faite pour le passeur:

// 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<MyClass, int>)Delegate.CreateDelegate(typeof(Action<MyClass, int>), theSetter);
// Set MyIntProperty to 5...
stronglyTypedSetter(target, 5);