c# - 加速反射调用 C#/.NET

标签 c# .net reflection invoke

有很多关于加速反射调用的帖子,这里有例子:

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/

相关文章:

c# - 使用集合初始化程序时是否推断出初始容量?

c# - 使用 vstest.consol.exe 运行 Moq 单元测试

.net - Edmx 需要 Primary_Key?

c# - 以特定格式从剑道日历获取日期时间

c# - .NET 反射创建类属性

2.11 中的 Scala 脚本

java - 如何使用通用参数正确查询构造函数

c# - linq连接两个数组的方法

c# - Windows 8 - 自定义动态磁贴

c# - MVP 中的接口(interface)和类