首页 > 解决方案 > 如何使用反射调用接受 lambda 输入的通用方法

问题描述

我正在尝试做的类似于下面的问题:

如何使用反射调用泛型方法?

但我试图调用的函数需要一个 lambda 输入

(我通过选择继承不同接口的程序集从域程序集中添加公共交通消费者)

编码:

        private static void AddLimitedConcurrencyMessageRecievers(IServiceCollectionBusConfigurator x, Assembly[] assemblies)
        {
            IEnumerable<Type> types = assemblies.SelectMany(s => s.GetExportedTypes())
                .Where(w => w.IsClass && !w.IsAbstract && w.IsPublic && typeof(IMessageReciever).IsAssignableFrom(w)).ToList();
            
            foreach (var item in types)
            {
                //x.AddConsumer<item>(y => y.UseConcurrentMessageLimit(1)); this is how I wished it would be like
                MethodInfo method = typeof(IRegistrationConfigurator).GetMethod(nameof(IRegistrationConfigurator.AddConsumer));
                MethodInfo generic = method.MakeGenericMethod(item);
                generic.Invoke(null, y => y.UseConcurrentMessageLimit(1)); //this still does not work
            }
                
        }

标签: c#genericsreflectionmasstransit

解决方案


感谢@canton7 和 Chris Patterson 的回复,这就是我设法解决问题的方法:


        public static void AddLimitedConcurrencyMessageRecievers<TMessageReciever>(this IServiceCollectionBusConfigurator x, params Assembly[] assemblies)
        {
            IEnumerable<Type> types = assemblies.SelectMany(s => s.GetExportedTypes())
                .Where(w => w.IsClass && !w.IsAbstract && w.IsPublic && typeof(TMessageReciever).IsAssignableFrom(w)).ToList();

            foreach (var item in types)
            {
                var method = typeof(MessageServices).GetMethod(nameof(AddLimitedConcurrencyConsumer));
                method.MakeGenericMethod(item).Invoke(null, new object[] { x });
            }

        }
        public static void AddLimitedConcurrencyConsumer<T>(this IServiceCollectionBusConfigurator x) where T : class, IConsumer
        {
            x.AddConsumer<T>(y => y.UseConcurrentMessageLimit(1));
        }

推荐阅读