Ускорение вызова отражения C # /. NET

Есть много сообщений по ускорению вызовов отражения, примеры здесь:

Ускорение API отражения с делегатом в .NET / C #

https://codeblog.jonskeet.uk/2008/08/09/making-reflection-fly-and- explore-delegates /

и здесь:

Пример: ускорение Reflection API с делегатом в .NET / C #



Мой вопрос касается ускорения общих вызовов. Возможно ли это вообще?

У меня есть абстрактный класс и класс, который его реализует ...

public abstract class EncasulatedMessageHandler where T : Message
{
    public abstract void HandleMessage(T message);
}

public class Handler : EncasulatedMessageHandler
{
    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 hook = new Action(delegate(object message)
{
    method.Invoke(handler, new object[] { message });
});

// Then when I want to invoke it:

hook(new MyMessageType());

Это еще не все, но это важные вещи ...

Метод method.Invoke очень медленный, я бы хотел сохранить общие параметры класса, я понимаю, что могу заблокировать это для объекта и передать его в метод HandleMessage, но я стараюсь этого не делать.

Могу я что-нибудь сделать, чтобы это ускорить? Сейчас это на порядки медленнее, чем прямые звонки.

Любая помощь будет принята с благодарностью.

15
задан Community 23 May 2017 в 11:54
поделиться