具有动态泛型类型的 C# 延迟加载方法(Func + Action)

fj123x

我有一个像“消息总线”一样的系统

    interface IMessageHandler<T> {
        void Handle(T message);
    }

    class MessageBus {
        private readonly Dictionary<Type, Action<object>> _handlers = new Dictionary<Type, Action<object>>();

        void AddHandler<T>(IMessageHandler<T> handler) {
            _messageHandlers[typeof(T)] = message => messageHandler.Handle((T)message);
        }

        public void Handle(object message)
        {
            _handlers[message.GetType()](message);
        }

    }

但不是直接传递消息处理程序的实例,我想传递一个 Func,以执行延迟加载方法(仅在第一次请求时实例化消息处理程序。然后如果我有 1000 个消息处理程序,并且在一个执行我只使用 5,我可以避免实例化另一个 995)

我目前完成它的方法(省略了包含定义+实例的列表并检查实例是否已经解析等的所有部分),

是在Handle调用它:

var messageType = message.GetType();
var definition = _definitions[messageType];
var instance = definition();
var handleMethod = instance.GetType().GetMethod("Handle");
handleMethod.Invoke(new [] {message});

但是性能会很差,有没有其他更好的方法?

谢谢

克恩德克

您可以使用Dictionary<Type, Lazy<Action<object>>>代替Dictionary<Type, Action<object>>,因此处理程序的实例将仅创建一次并且仅在必要时创建。

    class MessageBus
    {
        private readonly Dictionary<Type, Lazy<Action<object>>> _handlers = new Dictionary<Type, Lazy<Action<object>>>();

        public void AddHandler<T>(Func<IMessageHandler<T>> handlerFactory)
        {
            Func<Action<object>> objectHandlerFactory = CreateObjectHandlerFactory(handlerFactory);
            _handlers[typeof(T)] = new Lazy<Action<object>>(objectHandlerFactory);
        }

        public void Handle(object message)
        {
            _handlers[message.GetType()].Value(message);
        }

        private Func<Action<object>> CreateObjectHandlerFactory<T>(Func<IMessageHandler<T>> handlerFactory)
        {
            return () =>
            {
                var handler = handlerFactory();
                return message => handler.Handle((T)message);
            };
        }
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C#动态加载具有每个字符串动态类型参数和强类型结果的泛型类

c#中具有多个类型参数的泛型方法

如何将动态类型传递给在 Scala 中已经具有泛型类型的方法

具有嵌套泛型类型的方法

如何在 C# 中使用反射调用带有 Action<T> 参数的泛型方法

Dart中具有泛型的扩展方法:无法从方法返回动态类型的值

C#如何对具有泛型类型的两个类使用一种方法?

具有两个泛型参数的C#中的泛型方法

C#泛型类作为参数,与泛型类的调用方法具有相同的T

c#中具有泛型类的泛型方法

具有C ++和Lua的泛型类型

具有类型约束的泛型的C#nameof

类中具有2个泛型类型的方法,其中1个泛型类型

C#泛型如何获取没有对象类型作为参数的泛型方法的参数类型?

调用具有多个泛型类型的泛型方法,而无需指定每个泛型类型

在C#中检查T泛型类型具有属性S(泛型)

具有泛型接口参数类型的Java通用方法

具有类型约束或基类参数的泛型方法

具有泛型返回类型的静态方法

如何继承具有不同泛型返回类型的方法

具有用户定义类型的泛型方法

具有类型依赖参数的 TypeScript 泛型方法

具有基本类型的泛型方法

Java非泛型方法隐藏具有交集类型的泛型方法

c#泛型:我可以将重载方法合并为具有不同返回/输入数据类型的方法吗?

具有泛型参数和返回类型的泛型方法

具有子泛型类型的泛型工厂方法

具有不同类型泛型参数的方法的泛型类

具有泛型返回类型的泛型类和方法的委托