Есть много сообщений об ускорении вызова отражения, примеры здесь:
Ускорение API Reflection с делегатом в .NET/С#
https://codeblog.jonskeet.uk/2008/08/09/making-reflection-fly-and-exploring-delegates/
и здесь:
Пример: Ускорение API Reflection с делегатом в .NET/С#
Мой вопрос об ускорении общих вызовов. Возможно ли это вообще?
У меня есть абстрактный класс и класс, который его реализует...
public abstract class EncasulatedMessageHandler<T> where T : Message
{
public abstract void HandleMessage(T message);
}
public class Handler : EncasulatedMessageHandler<MyMessageType>
{
public int blat = 0;
public override void HandleMessage(MyMessageType message) { blat++; }
}
Что я хочу сделать, это создать список этих классов обработчиков сообщений и быстро вызвать их HandleMessage()
В настоящий момент я делаю то, что примерно так:
object handler = Activator.CreateInstance(typeof(Handler)); // Ignore this, this is done up front.
MethodInfo method = type.GetMethod("HandleMessage", BindingFlags.Instance | BindingFlags.Public);
Action<object> hook = new Action<object>(delegate(object message)
{
method.Invoke(handler, new object[] { message });
});
// Then when I want to invoke it:
hook(new MyMessageType());
Это не все, но это важный материал...
Метод .Invoke очень медленный, я хотел бы сохранить общие параметры в классе, я понимаю, что могу заблокировать это для объекта и применить его в методе HandleMessage, но я стараюсь избегать этого.
Есть ли что-нибудь, что я могу сделать, чтобы ускорить это? Он в настоящее время на порядок медленнее прямых вызовов.
Любая помощь будет оценена.