As it happens I have just explicitly declared the interfaces for the specific types I want to handle and passed them on to the generic code the other side of the WCF service contract e.g.
<operationcontract()>
<webget(responseformat:>
Function GetActiveClients(ByVal query As GetActiveClientsQueryDefinition) As IReadOnlyList(Of ClientSummary)
and the implementation of this is:-
Public Function GetActiveClients(query As GetActiveClientsQueryDefinition) As IReadOnlyList(Of ClientSummary) Implements IQueryHandlerService.GetActiveClients
If (m_queryHandler IsNot Nothing) Then
Return m_queryHandler.Handle(query)
Else
Return New List(Of ClientSummary)()
End If
End Function
where m_queryHandler.Handle is the generic function :-
Public Function Handle(Of TResult)(query As Query.IQueryDefinition(Of TResult)) As TResult
Dim handler = GetHandler(Of TResult)(query)
If (handler IsNot Nothing) Then
Return handler.Handle(query)
Else
Return Nothing
End If
End Function