Looking for c# Keywords? Try Ask4Keywords

C# Language Получить строго типизированного делегата для метода или свойства посредством отражения


пример

Когда производительность вызывает беспокойство, вызов метода через отражение (т. MethodInfo.Invoke Методом MethodInfo.Invoke ) не идеален. Тем не менее, относительно просто получить более производительный сильно типизированный делегат, используя функцию Delegate.CreateDelegate . Снижение производительности за использование отражения происходит только во время процесса создания делегата. Как только делегат создан, для его активации есть мало шансов на производительность:

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

Этот метод можно распространить и на свойства. Если у нас есть класс с именем MyClass с свойством int именем MyIntProperty , то код для получения сильно типизированного getter будет (следующий пример предполагает, что «target» является допустимым экземпляром 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));

... и то же самое можно сделать для сеттера:

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