Ci sono un sacco di posti per l'accelerazione riflessione invoca, esempi qui:.Accelerare Riflessione Invoke C#/NET
Speeding up Reflection API with delegate in .NET/C#
https://codeblog.jonskeet.uk/2008/08/09/making-reflection-fly-and-exploring-delegates/
e qui:
Example : Speeding up Reflection API with delegate in .NET/C#
La mia domanda riguarda l'accelerazione dei richiami generici. Ciò è effettivamente possibile?
Ho una classe astratta e una classe che implementa ...
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++; }
}
Quello che voglio fare è costruire un elenco di queste classi di gestione dei messaggi e rapidamente richiamare la loro HandleMessage()
al momento, sto facendo qualcosa che è circa questo:
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());
Questo non è il tutto, ma è le cose importanti ...
Il method.Invoke è molto lento, mi piacerebbe mantenere i parametri generici sulla classe, mi rendo conto che avrei potuto bloccare questo fino a oggetto e gettarlo nel metodo HandleMessage, ma sto cercando di evitare di farlo.
C'è qualcosa che posso fare per velocizzare questo? Attualmente gli ordini di grandezza sono più lenti delle chiamate dirette.
Qualsiasi aiuto sarebbe apprezzato.
Sembra lanciare RuntimeBinderException: la migliore corrispondenza del metodo sovraccarico per "X" ha alcuni argomenti non validi. – Rob
@Rob: Che dire di '((dynamic) handler) .HandleMessage ((dynamic) message)'? – Gabe
Questo funziona! :) Woot! – Rob