protected override void BuildConstantsInternal(SizeCounterConstantsBuilderContext context) { foreach (var argumentType in Type.GetGenericArguments()) { context.BuildConstants(argumentType); } }
public IntPtr BuildSizeCounter(Type type, bool ignoreCustomSerialization) { var constantsBuilder = module.DefineType(type.Name + "_GroBufSizeCounterConstants_" + Guid.NewGuid(), TypeAttributes.Class | TypeAttributes.Public); constantsBuilder.DefineField("pointers", typeof(IntPtr[]), FieldAttributes.Private | FieldAttributes.Static); constantsBuilder.DefineField("delegates", typeof(Delegate[]), FieldAttributes.Private | FieldAttributes.Static); var constantsBuilderContext = new SizeCounterConstantsBuilderContext(groBufWriter, constantsBuilder, sizeCounterCollection, dataMembersExtractor); constantsBuilderContext.BuildConstants(type, true, ignoreCustomSerialization); var constantsType = constantsBuilder.CreateType(); var fields = constantsBuilderContext.GetFields().ToDictionary(pair => pair.Key, pair => pair.Value.Select(constantsType.GetField).ToArray()); var context = new SizeCounterBuilderContext(groBufWriter, module, constantsType, fields, sizeCounterCollection, dataMembersExtractor); var sizeCounter = context.GetCounter(type, true, ignoreCustomSerialization); var initializer = BuildInitializer(constantsType.GetField("pointers", BindingFlags.Static | BindingFlags.NonPublic), constantsType.GetField("delegates", BindingFlags.Static | BindingFlags.NonPublic)); var compiledDynamicMethods = context.GetMethods(); var pointers = new IntPtr[compiledDynamicMethods.Length]; var delegates = new Delegate[compiledDynamicMethods.Length]; foreach (var pair in compiledDynamicMethods) { var compiledDynamicMethod = pair.Value; var index = compiledDynamicMethod.Index; pointers[index] = compiledDynamicMethod.Pointer; delegates[index] = compiledDynamicMethod.Delegate; if (compiledDynamicMethod.Pointer != sizeCounter.Pointer) { groBufWriter.countersWithCustomSerialization[pair.Key] = (IntPtr?)compiledDynamicMethod.Pointer; } } initializer(pointers, delegates, context.GetFieldInitializers()); return(sizeCounter.Pointer); }
protected override void BuildConstantsInternal(SizeCounterConstantsBuilderContext context) { foreach (var member in context.GetDataMembers(Type)) { Type memberType; switch (member.Member.MemberType) { case MemberTypes.Property: memberType = ((PropertyInfo)member.Member).PropertyType; break; case MemberTypes.Field: memberType = ((FieldInfo)member.Member).FieldType; break; default: throw new NotSupportedException("Data member of type " + member.Member.MemberType + " is not supported"); } context.BuildConstants(memberType); } }
protected override void BuildConstantsInternal(SizeCounterConstantsBuilderContext context) { context.BuildConstants(elementType); }
protected override void BuildConstantsInternal(SizeCounterConstantsBuilderContext context) { context.BuildConstants(Type.GetGenericArguments()[0]); }
protected override void BuildConstantsInternal(SizeCounterConstantsBuilderContext context) { context.BuildConstants(typeof(object)); }
protected override void BuildConstantsInternal(SizeCounterConstantsBuilderContext context) { context.BuildConstants(keyType); context.BuildConstants(valueType); }
protected override void BuildConstantsInternal(SizeCounterConstantsBuilderContext context) { context.SetFields(Type, new[] { new KeyValuePair <string, Type>("counters_" + Type.Name + "_" + Guid.NewGuid(), typeof(IntPtr[])), new KeyValuePair <string, Type>("delegates_" + Type.Name + "_" + Guid.NewGuid(), typeof(Delegate[])) // This field is needed only to save references to the dynamic methods. Otherwise GC will destroy them }); Array.ForEach(GroBufHelpers.LeafTypes.Where(type => type != null).ToArray(), type => context.BuildConstants(type)); }