/// <summary> /// Wraps all component methods returning IEnumerable{T} or IQueryable{T}. /// </summary> /// <typeparam name="I">Interface to wrap.</typeparam> /// <param name="uniqueName">Component unique name.</param> private void RegisterQueryableMethods <I>(string uniqueName) { foreach (var mi in typeof(I).GetMethods()) { if (mi.IsGenericMethod && mi.GetParameters().Length == 0) { if (typeof(IEnumerable).IsAssignableFrom(mi.ReturnType) || typeof(IQueryable).IsAssignableFrom(mi.ReturnType)) { var queryHandler = new ZyanMethodQueryHandler(this, uniqueName, mi); var remoteHandler = new ZyanServerQueryHandler(queryHandler); RegisterComponent <IQueryRemoteHandler, ZyanServerQueryHandler>(queryHandler.MethodQueryHandlerName, remoteHandler, null); } } } }
/// <summary> /// Handles LINQ queries. /// </summary> /// <param name="methodCallMessage"><see cref="IMethodCallMessage"/> to process.</param> /// <param name="methodInfo"><see cref="MethodInfo"/> for the method being called.</param> /// <returns><see cref="ReturnMessage"/>, if the call is processed successfully, otherwise, false.</returns> private ReturnMessage HandleLinqQuery(IMethodCallMessage methodCallMessage, MethodInfo methodInfo) { if (methodInfo.GetParameters().Length == 0 && methodInfo.GetGenericArguments().Length == 1 && (typeof(IEnumerable).IsAssignableFrom(methodInfo.ReturnType) || typeof(IQueryable).IsAssignableFrom(methodInfo.ReturnType))) { var elementType = methodInfo.GetGenericArguments().First(); var serverHandlerName = ZyanMethodQueryHandler.GetMethodQueryHandlerName(_uniqueName, methodInfo); var clientHandler = new ZyanClientQueryHandler(_connection, serverHandlerName); var returnValue = clientHandler.Get(elementType); return(new ReturnMessage(returnValue, null, 0, methodCallMessage.LogicalCallContext, methodCallMessage)); } // This method call doesn't represent a LINQ query return(null); }
/// <summary> /// Wraps all component methods returning IEnumerable{T} or IQueryable{T}. /// </summary> /// <typeparam name="I">Interface to wrap.</typeparam> /// <param name="uniqueName">Component unique name.</param> private void RegisterQueryableMethods <I>(string uniqueName) { foreach (var mi in typeof(I).GetMethods()) { if (mi.IsGenericMethod && mi.GetParameters().Length == 0 && mi.ReturnType.IsGenericType) { var returnTypeDef = mi.ReturnType.GetGenericTypeDefinition(); if (returnTypeDef == typeof(IEnumerable <>) || returnTypeDef == typeof(IQueryable <>)) { var queryHandler = new ZyanMethodQueryHandler(this, uniqueName, mi); var remoteHandler = new ZyanServerQueryHandler(queryHandler); RegisterComponent <IQueryRemoteHandler, ZyanServerQueryHandler>(queryHandler.MethodQueryHandlerName, remoteHandler, null); } } } }