internal void ILGenForCreateInstance(CodeGenerator ilg, Type type, Type cast, bool nonPublic) { // Special case DBNull if (type == Globals.TypeOfDBNull) { FieldInfo DBNull_Value = Globals.TypeOfDBNull.GetField("Value", CodeGenerator.StaticBindingFlags); ilg.LoadMember(DBNull_Value); return; } // Special case XElement // codegen the same as 'internal XElement : this("default") { }' if (type.FullName == "System.Xml.Linq.XElement") { Type xName = type.GetTypeInfo().Assembly.GetType("System.Xml.Linq.XName"); if (xName != null) { MethodInfo XName_op_Implicit = xName.GetMethod( "op_Implicit", CodeGenerator.StaticBindingFlags, new Type[] { typeof(String) } ); ConstructorInfo XElement_ctor = type.GetConstructor( CodeGenerator.InstanceBindingFlags, new Type[] { xName } ); if (XName_op_Implicit != null && XElement_ctor != null) { ilg.Ldstr("default"); ilg.Call(XName_op_Implicit); ilg.New(XElement_ctor); return; } } } Label labelReturn = ilg.DefineLabel(); Label labelEndIf = ilg.DefineLabel(); // TypeInfo typeInfo = type.GetTypeInfo(); // typeInfo not declared explicitly ilg.Ldc(type); MethodInfo getTypeInfoMehod = typeof(IntrospectionExtensions).GetMethod( "GetTypeInfo", CodeGenerator.StaticBindingFlags, new[] { typeof(Type) } ); ilg.Call(getTypeInfoMehod); // IEnumerator<ConstructorInfo> e = typeInfo.DeclaredConstructors.GetEnumerator(); LocalBuilder enumerator = ilg.DeclareLocal(typeof(IEnumerator<>).MakeGenericType(typeof(ConstructorInfo)), "e"); MethodInfo getDeclaredConstructors = typeof(TypeInfo).GetMethod("get_DeclaredConstructors"); MethodInfo getEnumerator = typeof(IEnumerable<>).MakeGenericType(typeof(ConstructorInfo)).GetMethod("GetEnumerator"); ilg.Call(getDeclaredConstructors); ilg.Call(getEnumerator); ilg.Stloc(enumerator); ilg.WhileBegin(); // ConstructorInfo constructorInfo = e.Current(); MethodInfo enumeratorCurrent = typeof(IEnumerator).GetMethod("get_Current"); ilg.Ldloc(enumerator); ilg.Call(enumeratorCurrent); LocalBuilder constructorInfo = ilg.DeclareLocal(typeof(ConstructorInfo), "constructorInfo"); ilg.Stloc(constructorInfo); // if (!constructorInfo.IsStatic && constructorInfo.GetParameters.Length() == 0) ilg.Ldloc(constructorInfo); MethodInfo constructorIsStatic = typeof(ConstructorInfo).GetMethod("get_IsStatic"); ilg.Call(constructorIsStatic); ilg.Brtrue(labelEndIf); ilg.Ldloc(constructorInfo); MethodInfo constructorGetParameters = typeof(ConstructorInfo).GetMethod("GetParameters"); ilg.Call(constructorGetParameters); ilg.Ldlen(); ilg.Ldc(0); ilg.Cne(); ilg.Brtrue(labelEndIf); // constructorInfo.Invoke(null); MethodInfo constructorInvoke = typeof(ConstructorInfo).GetMethod("Invoke", new Type[] { typeof(object[]) }); ilg.Ldloc(constructorInfo); ilg.Load(null); ilg.Call(constructorInvoke); ilg.Br(labelReturn); ilg.MarkLabel(labelEndIf); ilg.WhileBeginCondition(); // while (e.MoveNext()) MethodInfo IEnumeratorMoveNext = typeof(IEnumerator).GetMethod( "MoveNext", CodeGenerator.InstanceBindingFlags, Array.Empty<Type>()); ilg.Ldloc(enumerator); ilg.Call(IEnumeratorMoveNext); ilg.WhileEndCondition(); ilg.WhileEnd(); MethodInfo Activator_CreateInstance = typeof(Activator).GetMethod( "CreateInstance", CodeGenerator.StaticBindingFlags, new Type[] { typeof(Type) } ); ilg.Ldc(type); ilg.Call(Activator_CreateInstance); ilg.MarkLabel(labelReturn); if (cast != null) ilg.ConvertValue(Activator_CreateInstance.ReturnType, cast); }