public override ImmutableCollectionCreator ImmutableDictionaryCreateRange(Type constructingType, Type collectionType, Type elementType) { Debug.Assert(collectionType.IsGenericType); // Only string keys are allowed. if (collectionType.GetGenericArguments()[0] != typeof(string)) { throw ThrowHelper.GetNotSupportedException_SerializationNotSupportedCollection(collectionType, parentType: null, memberInfo: null); } MethodInfo createRange = ImmutableDictionaryCreateRangeMethod(constructingType, elementType); if (createRange == null) { return(null); } Type creatorType = typeof(ImmutableDictionaryCreator <,>).MakeGenericType(elementType, collectionType); ConstructorInfo constructor = creatorType.GetConstructor( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, binder: null, Type.EmptyTypes, modifiers: null); ImmutableCollectionCreator creator = (ImmutableCollectionCreator)constructor.Invoke(Array.Empty <object>()); creator.RegisterCreatorDelegateFromMethod(createRange); return(creator); }
public override ImmutableCollectionCreator ImmutableDictionaryCreateRange(Type constructingType, Type collectionType, Type elementType) { Debug.Assert(collectionType.IsGenericType); // Only string keys are allowed. if (collectionType.GetGenericArguments()[0] != typeof(string)) { throw ThrowHelper.GetNotSupportedException_SerializationNotSupportedCollection(collectionType, parentType: null, memberInfo: null); } MethodInfo createRange = ImmutableDictionaryCreateRangeMethod(constructingType, elementType); if (createRange == null) { return(null); } Type creatorType = typeof(ImmutableDictionaryCreator <,>).MakeGenericType(elementType, collectionType); ConstructorInfo realMethod = creatorType.GetConstructor( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, binder: null, Type.EmptyTypes, modifiers: null); Debug.Assert(realMethod != null); var dynamicMethod = new DynamicMethod( ConstructorInfo.ConstructorName, typeof(object), Type.EmptyTypes, typeof(ReflectionEmitMemberAccessor).Module, skipVisibility: true); ILGenerator generator = dynamicMethod.GetILGenerator(); generator.Emit(OpCodes.Newobj, realMethod); generator.Emit(OpCodes.Ret); JsonClassInfo.ConstructorDelegate constructor = (JsonClassInfo.ConstructorDelegate)dynamicMethod.CreateDelegate( typeof(JsonClassInfo.ConstructorDelegate)); ImmutableCollectionCreator creator = (ImmutableCollectionCreator)constructor(); creator.RegisterCreatorDelegateFromMethod(createRange); return(creator); }
public override ImmutableCollectionCreator ImmutableDictionaryCreateRange(Type constructingType, Type collectionType, Type elementType) { MethodInfo createRange = ImmutableDictionaryCreateRangeMethod(constructingType, elementType); if (createRange == null) { return(null); } Type creatorType = typeof(ImmutableDictionaryCreator <,>).MakeGenericType(elementType, collectionType); ConstructorInfo realMethod = creatorType.GetConstructor( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, binder: null, Type.EmptyTypes, modifiers: null); Debug.Assert(realMethod != null); var dynamicMethod = new DynamicMethod( ConstructorInfo.ConstructorName, typeof(object), Type.EmptyTypes, typeof(ReflectionEmitMemberAccessor).Module, skipVisibility: true); ILGenerator generator = dynamicMethod.GetILGenerator(); generator.Emit(OpCodes.Newobj, realMethod); generator.Emit(OpCodes.Ret); JsonClassInfo.ConstructorDelegate constructor = (JsonClassInfo.ConstructorDelegate)dynamicMethod.CreateDelegate( typeof(JsonClassInfo.ConstructorDelegate)); ImmutableCollectionCreator creator = (ImmutableCollectionCreator)constructor(); creator.RegisterCreatorDelegateFromMethod(createRange); return(creator); }
public override ImmutableCollectionCreator ImmutableCollectionCreateRange(Type constructingType, Type collectionType, Type elementType) { MethodInfo createRange = ImmutableCollectionCreateRangeMethod(constructingType, elementType); if (createRange == null) { return(null); } Type creatorType = typeof(ImmutableEnumerableCreator <,>).MakeGenericType(elementType, collectionType); ConstructorInfo constructor = creatorType.GetConstructor( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, binder: null, Type.EmptyTypes, modifiers: null); ImmutableCollectionCreator creator = (ImmutableCollectionCreator)constructor.Invoke(Array.Empty <object>()); creator.RegisterCreatorDelegateFromMethod(createRange); return(creator); }