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)); }
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)); }
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); }
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); } }