コード例 #1
0
 /// <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);
             }
         }
     }
 }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
ファイル: ComponentCatalog.cs プロジェクト: zyanfx/Zyan
 /// <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);
             }
         }
     }
 }