private static Type Type( string name, Type[] interfaces, MemberDefinition[] memberDefinitions, TypeAttributes typeAttributes, Type baseType = null) { if (name == null) { throw new ArgumentNullException("name"); } if (interfaces == null) { throw new ArgumentNullException("interfaces"); } if (memberDefinitions == null) { throw new ArgumentNullException("memberDefinitions"); } #if NET40 var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly( #else var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly( #endif new AssemblyName(name), AssemblyBuilderAccess.Run); var moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule"); var typeBuilder = moduleBuilder.DefineType(name, typeAttributes, baseType, interfaces); var fields = new List <FieldBuilder>(); foreach (var definition in memberDefinitions.OrderBy(d => d is ConstructorDefinition)) { definition.EmitTo(typeBuilder, fields); } if (baseType != typeof(ValueType) && !memberDefinitions.Any(d => d is ConstructorDefinition)) { Define.Constructor().EmitTo(typeBuilder, fields); } return(typeBuilder.CreateType()); }
private static MemberDefinition NestedType(string name, Type[] interfaces, MemberDefinition[] memberDefinitions, TypeAttributes typeAttributes, Visibility visibility, Type baseType = null) { if (name == null) { throw new ArgumentNullException("name"); } if (interfaces == null) { throw new ArgumentNullException("interfaces"); } if (memberDefinitions == null) { throw new ArgumentNullException("memberDefinitions"); } typeAttributes |= GetNestedVisibility(visibility); return(new MemberDefinition((tb, fields) => { var nestedTypeBuilder = tb.DefineNestedType(name, typeAttributes, baseType, interfaces); var nestedFields = new List <FieldBuilder>(); foreach (var definition in memberDefinitions.OrderBy(d => d is ConstructorDefinition)) { definition.EmitTo(nestedTypeBuilder, nestedFields); } if (baseType != typeof(ValueType) && !memberDefinitions.Any(d => d is ConstructorDefinition)) { // ReSharper disable once RedundantNameQualifier Define.Constructor().EmitTo(nestedTypeBuilder, nestedFields); } nestedTypeBuilder.CreateType(); })); }
private static Type Type( string name, Type[] interfaces, MemberDefinition[] memberDefinitions, TypeAttributes typeAttributes, Type?baseType = null) { if (name is null) { throw new ArgumentNullException(nameof(name)); } if (interfaces is null) { throw new ArgumentNullException(nameof(interfaces)); } if (memberDefinitions is null) { throw new ArgumentNullException(nameof(memberDefinitions)); } var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly( new AssemblyName(name), AssemblyBuilderAccess.Run); var moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule"); var typeBuilder = moduleBuilder.DefineType(name, typeAttributes, baseType, interfaces); var fields = new Collection <FieldBuilder>(); foreach (var definition in memberDefinitions.OrderBy(d => d is ConstructorDefinition)) { definition.EmitTo(typeBuilder, fields); } if (baseType != typeof(ValueType) && !memberDefinitions.Any(d => d is ConstructorDefinition)) { Define.Constructor().EmitTo(typeBuilder, fields); } return(typeBuilder.CreateType() !); }