public void DefineTypeFacets() { EnsureState(2); if (_mutableType.BaseType != null) { _context.TypeBuilder.SetParent(_mutableType.BaseType); } if (_mutableType.MutableTypeInitializer != null) { _memberEmitter.AddConstructor(_context, _mutableType.MutableTypeInitializer); } // Creation of initialization members must happen before interfaces, fields or methods are added. var initializationMembers = _initializationBuilder.CreateInitializationMembers(_mutableType); var initializationMethod = initializationMembers != null ? initializationMembers.Item2 : null; _proxySerializationEnabler.MakeSerializable(_mutableType, initializationMethod); foreach (var attribute in _mutableType.AddedCustomAttributes) { _context.TypeBuilder.SetCustomAttribute(attribute); } foreach (var ifc in _mutableType.AddedInterfaces) { _context.TypeBuilder.AddInterfaceImplementation(ifc); } foreach (var field in _mutableType.AddedFields) { _memberEmitter.AddField(_context, field); } foreach (var ctor in _mutableType.AddedConstructors) { WireAndAddConstructor(_memberEmitter, _context, ctor, initializationMembers); } foreach (var method in _mutableType.AddedMethods) { _memberEmitter.AddMethod(_context, method); } // Note that accessor methods must be added before their associated properties and events. foreach (var property in _mutableType.AddedProperties) { _memberEmitter.AddProperty(_context, property); } foreach (var evt in _mutableType.AddedEvents) { _memberEmitter.AddEvent(_context, evt); } }
private void WireAndAddConstructor( IMemberEmitter member, CodeGenerationContext context, MutableConstructorInfo constructor, Tuple <FieldInfo, MethodInfo> initializationMembers) { _initializationBuilder.WireConstructorWithInitialization(constructor, initializationMembers, _proxySerializationEnabler); member.AddConstructor(context, constructor); }