我想做的事情與下面的問題類似:
如何使用反射來呼叫泛型方法?
但是我試圖呼叫的函式需要一個 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)); 這是我希望的樣子。
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。
}
}
uj5u.com熱心網友回復:
你應該不需要使用任何通用/invoke向導來添加你的消費者。有一個非通用版本的AddConsumer,它接受一個Type,你可以使用消費者定義或IConfigureReceiveEndpoint來在創建接收端點時添加附加配置。
有大量的配置方法來支持通用和非通用場景,所以不要試圖強迫自己使用通用方法,導致下一個開發人員會討厭你寫的代碼。
uj5u.com熱心網友回復:
感謝@canton7和Chris Patterson的回復,這是我解決這個問題的方法:
public static void AddLimitedConcurrencyMessageRecievers< TMessageReciever>(thisIServiceCollectionBusConfigurator x, paramsAssembly[] 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>(thisIServiceCollectionBusConfigurator x) whereT : class, IConsumer
{
x.AddConsumer<T>(y => y.UseConcurrentMessageLimit(1)。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/330171.html
標籤:
