private void AddHandler(MethodInfo method, Type messageType, FilterChain filterChain, bool isSyncHandler, bool isReentrant)
{
if (method.IsGenericMethod == false)
{
if (isSyncHandler)
{
var item = new MessageHandlerItem
{
IsReentrant = isReentrant,
Handler = BuildHandler(_type, messageType, method, filterChain)
};
_table.Add(messageType, item);
}
else
{
var item = new MessageHandlerItem
{
IsReentrant = isReentrant,
AsyncHandler = BuildAsyncHandler(_type, messageType, method, filterChain)
};
_table.Add(messageType, item);
}
}
else
{
// because a generic method needs parameter types to construct handler
// so factory method is built to generate the handler when paramter types are ready
var defType = messageType.GetGenericTypeDefinition();
if (isSyncHandler)
{
_table.Add(defType, new MessageHandlerItem
{
IsReentrant = isReentrant,
IsGeneric = true,
GenericHandlerBuilder = t => new MessageHandlerItem
{
IsReentrant = isReentrant,
Handler = BuildGenericHandler(_type, t, method, filterChain)
}
});
}
else
{
_table.Add(defType, new MessageHandlerItem
{
IsReentrant = isReentrant,
IsGeneric = true,
GenericHandlerBuilder = t => new MessageHandlerItem
{
IsReentrant = isReentrant,
AsyncHandler = BuildGenericAsyncHandler(_type, t, method, filterChain)
}
});
}
}
}