public async Task GetHandlerInfo_FindInnerClassHandlerInfo( string message, [Frozen] IMessageTypeTopicMap messageTypeTopicMap, MessageHandlerInfoProvider sut) { var messageType = typeof(string); messageTypeTopicMap.GetMessageTypes().Returns(new[] { messageType }); var actual = sut.GetHandlerInfo(); var handlerInfo = Assert.Single(actual); Assert.Equal(messageType, handlerInfo.messageType); Assert.Equal(typeof(IMessageHandler <string>), handlerInfo.handlerType); bool callbackFired = false; var handler = new TestStringHandler(m => { callbackFired = true; Assert.Equal(message, m); }); await handlerInfo.handleMethod(handler, message, None); Assert.True(callbackFired); }
GetHandlerInfo() { // Creates a a tuple with the type of handler and message with a delegate to invoke the Handle. return(from messageType in _typeTopicMap.GetMessageTypes() let handlerType = typeof(IMessageHandler <>).MakeGenericType(messageType) let handleMethod = handlerType.GetTypeInfo().GetMethod(nameof(IMessageHandler <object> .Handle)) let handlerInstance = Expression.Parameter(typeof(object)) let messageInstance = Expression.Parameter(typeof(object)) let tokenInstance = Expression.Parameter(typeof(CancellationToken)) let handleFunc = Expression.Lambda <Func <object, object, CancellationToken, Task> >( Expression.Call( Expression.Convert( handlerInstance, handlerType), handleMethod, Expression.Convert( messageInstance, messageType), tokenInstance), handlerInstance, messageInstance, tokenInstance) .Compile() select(messageType, handlerType, handleFunc)); }