public static object ParseDictionaryType(StringSegment value, Type createMapType, Type[] argTypes,
                                                 ParseStringSegmentDelegate keyParseFn, ParseStringSegmentDelegate valueParseFn)
        {
            var key = new TypesKey(argTypes[0], argTypes[1]);

            if (ParseDelegateCache.TryGetValue(key, out var parseDelegate))
            {
                return(parseDelegate(value, createMapType, keyParseFn, valueParseFn));
            }

            var mi        = typeof(DeserializeDictionary <TSerializer>).GetStaticMethod("ParseDictionary", signature);
            var genericMi = mi.MakeGenericMethod(argTypes);

            parseDelegate = (ParseDictionaryDelegate)genericMi.MakeDelegate(typeof(ParseDictionaryDelegate));

            Dictionary <TypesKey, ParseDictionaryDelegate> snapshot, newCache;

            do
            {
                snapshot      = ParseDelegateCache;
                newCache      = new Dictionary <TypesKey, ParseDictionaryDelegate>(ParseDelegateCache);
                newCache[key] = parseDelegate;
            }while (!ReferenceEquals(
                        Interlocked.CompareExchange(ref ParseDelegateCache, newCache, snapshot), snapshot));

            return(parseDelegate(value, createMapType, keyParseFn, valueParseFn));
        }
예제 #2
0
        public async Task <byte[]> Handle(object serviceImplementation, byte[] data, int offset)
        {
            var genericArguments    = DecodeGenericArguments(data, ref offset);
            var genericArgumentsKey = new TypesKey(genericArguments);
            var rawHandler          = rawHandlers.GetOrAdd(genericArgumentsKey, k => createRawHandler(k.Types));

            return(await rawHandler.Handle(serviceImplementation, data, offset));
        }
예제 #3
0
        public async Task<byte[]> Handle(object serviceImplementation, byte[] data, int offset)
        {
            var genericArguments = DecodeGenericArguments(data, ref offset);
            var genericArgumentsKey = new TypesKey(genericArguments);
            var rawHandler = rawHandlers.GetOrAdd(genericArgumentsKey, k => createRawHandler(k.Types));

            return await rawHandler.Handle(serviceImplementation, data, offset);
        }
예제 #4
0
        private static void AppendMathOperationSet(ModuleDefinition moduleDefinition, TypeDefinition definition)
        {
            var configTypes = new Dictionary <TypesKey, TypeDefinition>();

            foreach (var method in typeof(math).GetMethods(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static).Where(m => ValidMethod(m)))
            {
                var key = new TypesKey(method.GetParameters().Select(p => p.ParameterType).ToArray());
                if (!configTypes.TryGetValue(key, out TypeDefinition type))
                {
                    type             = CreateConfigType(moduleDefinition, method);
                    configTypes[key] = type;
                }
                AppendMathOperation(moduleDefinition, definition, type, method);
            }
        }