c# - 如何使用反射调用接受 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
}
}
解决方案
感谢@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));
}
推荐阅读
- macos - 为什么当我尝试使用 grep ether 过滤 ifconfig 结果以仅显示媒体显示的 MAC 地址时?
- selenium - Selenium:等到属性值改变
- python - 如何根据用户输入自动添加唯一键,然后在python中更新它
- c# - FromBody 收到的帖子导致可序列化错误
- typescript - 使用映射类型返回函数返回类型的对象
- android - 如何使用用户幻灯片使动画进度
- python - python解析文本并添加到列表
- spring - JPA Hibernate 无法将 java.lang.String 字段设置为 java.lang.String 异常
- swift - 检查数组中的多个值
- javascript - 如何根据php中的搜索条件在动态表中显示