有很多关于加速反射调用的帖子,这里有例子:
Speeding up Reflection API with delegate in .NET/C#
https://codeblog.jonskeet.uk/2008/08/09/making-reflection-fly-and-exploring-delegates/
这里:
Example : Speeding up Reflection API with delegate in .NET/C#
我的问题是关于加速通用调用。这可能吗?
我有一个抽象类和一个实现它的类...
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());
这不是全部,但这是重要的事情......
method.Invoke 非常慢,我想在类上保留通用参数,我意识到我可以将其锁定到对象并将其转换为 HandleMessage 方法,但我试图避免这样做.
我可以做些什么来加快速度吗?它目前比直接调用慢几个数量级。
如有任何帮助,我们将不胜感激。
最佳答案
您使用的是 C# 4 吗?如果是这样,dynamic
可能会加快速度:
Action<object> hook = message => ((dynamic)handler).HandleMessage((dynamic)message);
关于c# - 加速反射调用 C#/.NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7189642/