私はこれをするのが嫌いですが、これには多大な時間を費やしました。以下は、C#メソッドをMethodBuilderに変換しようとする試みです。結果は、EFCodeFirstを使用してEntityFrameworkのOnModelCreatingのオーバーライドメソッドである必要があります。MethodBuilder for Entity Frameworkの結果が「不正な形式」のプログラム
private static MethodBuilder FormContextBuildMethodOnModelCreating(TypeBuilder type, string formId) {
System.Reflection.MethodAttributes methodAttributes = System.Reflection.MethodAttributes.Public | System.Reflection.MethodAttributes.Family | System.Reflection.MethodAttributes.Virtual | System.Reflection.MethodAttributes.HideBySig;
//method
MethodBuilder OnModelCreating = type.DefineMethod("OnModelCreating", methodAttributes);
//method calls
MethodInfo Conventions = typeof(ModelBuilder).GetMethod("get_Conventions", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] { }, null);
MethodInfo RemoveConventions = typeof(ConventionsConfiguration).GetMethod("Remove", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] { }, null);
MethodInfo Entity = typeof(ModelBuilder).GetMethod("Entity", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] { }, null);
MethodInfo ToTable1 = typeof(System.Data.Entity.ModelConfiguration.EntityTypeConfiguration<>).MakeGenericType(typeof(Form)).GetMethod("ToTable", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] { typeof(String) }, null);
MethodInfo ToTable2 = typeof(System.Data.Entity.ModelConfiguration.EntityTypeConfiguration<>).MakeGenericType(typeof(FormAg)).GetMethod("ToTable", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] { typeof(String) }, null);
OnModelCreating.SetReturnType(typeof(void));
OnModelCreating.SetParameters(typeof(ModelBuilder));
ParameterBuilder modelBuilder = OnModelCreating.DefineParameter(1, ParameterAttributes.None, "modelBuilder");
ILGenerator Il = OnModelCreating.GetILGenerator();
Il.Emit(OpCodes.Nop);
Il.Emit(OpCodes.Ldarg_1);
Il.Emit(OpCodes.Callvirt, Conventions);
Il.Emit(OpCodes.Callvirt, RemoveConventions);
Il.Emit(OpCodes.Nop);
Il.Emit(OpCodes.Ldarg_1);
Il.Emit(OpCodes.Callvirt, Entity);
Il.Emit(OpCodes.Ldstr, "Form" + formId);
Il.Emit(OpCodes.Callvirt, ToTable1);
Il.Emit(OpCodes.Nop);
Il.Emit(OpCodes.Ldarg_1);
Il.Emit(OpCodes.Callvirt, Entity);
Il.Emit(OpCodes.Ldstr, "FormAg" + formId);
Il.Emit(OpCodes.Callvirt, ToTable2);
Il.Emit(OpCodes.Nop);
Il.Emit(OpCodes.Ret);
return OnModelCreating;
}
オペコードは、上記の反射ILから収集された:ここで
は(モデル名は簡略化のために短縮)protected override void OnModelCreating(ModelBuilder modelBuilder) {
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
modelBuilder.Entity<Form>().ToTable("Form<Name>");
modelBuilder.Entity<FormAg>().ToTable("FormAg<Name>");
}
は、ここで私が現在使用しているMethodBuilderのC#での方法であり、 C#コード。私の人生にとって、私はここで何が間違っているのか理解できません。私は、他のすべてのプロパティと同様に正しく構築されていないものとして、このメソッドに問題を絞り込んだ。すべてのヘルプをいただければ幸いです An attempt was made to load a program with an incorrect format.
:
...結果の型は、次のエラーが発生し使用しようとする試みを、私は空体(Nop
+ Ret
)を返すことができ、それが正常に動作します。
ほんの少しの更新が、私はこの問題を回避働いてきたが、私は本当に私の方法を好きではありません。 :) formIdに渡す新しいコンストラクタで 'OnModelCreating'を含む基本クラスから継承する別のクラスを作成しました。しかし、真剣に、それは私が全部望んでいたものではありません:) – Buildstarted