リフレクションメカニズムを使用して完全に生成された複雑なオブジェクトのセットがあり、それらはすべて空のインターフェイスを実装しています。オブジェクト フィールドのエディタを表示するために使用したいのですHtml.EditorForModel()
が、現時点では空のページしか表示されません。
オブジェクトの1つをシリアル化すると、jsonにそのような構造があります
{
"ContractingAuthority":
{
"FirstName":null,
"LastName":null
},
"ContractInformation":
{
"Title":null,
"Description":null
}
}
したがって、json シリアライザーはすべてのフィールドを正しく見つけることができます。私が間違っていることは何か提案はありますか?
編集:
これまでのところ、私はそのようなスケッチコードを持っています:
var sequence = GetSequenceMetadata();
var assemblyName = new AssemblyName("Particles") { Version = new Version(1, 0, 0, 0) };
var assemblyBuilder = AppDomain.CurrentDomain
.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
var moduleBuilder = assemblyBuilder.DefineDynamicModule("ParticlesModule");
var typeBuilder = moduleBuilder.DefineType(string.Format("Particles.ParticlesModule.{0}", type.Name), TypeAttributes.Public | TypeAttributes.Class, null);
typeBuilder.AddInterfaceImplementation(typeof(IParticle));
foreach (var property in sequence.Items)
{
if (property is XmlSchemaElement)
{
var element = property as XmlSchemaElement;
var elementType = GetFieldType(element.ElementSchemaType.TypeCode);
var fieldBuilder = typeBuilder.DefineField(string.Format("_{0}", element.Name),
elementType, FieldAttributes.Private);
var propertyBuilder = typeBuilder.DefineProperty(element.Name, PropertyAttributes.None, elementType, null);
var propertyGetter = typeBuilder.DefineMethod("get_value", MethodAttributes.Public | MethodAttributes.HideBySig, elementType, Type.EmptyTypes);
var ilGetGenerator = propertyGetter.GetILGenerator();
ilGetGenerator.Emit(OpCodes.Ldarg_0);
ilGetGenerator.Emit(OpCodes.Ldfld, fieldBuilder);
ilGetGenerator.Emit(OpCodes.Ret);
var propertySetter = typeBuilder.DefineMethod("set_value", MethodAttributes.Public | MethodAttributes.HideBySig, null, new[] { elementType });
var ilSetGenerator = propertySetter.GetILGenerator();
ilSetGenerator.Emit(OpCodes.Ldarg_0);
ilSetGenerator.Emit(OpCodes.Ldarg_1);
ilSetGenerator.Emit(OpCodes.Stfld, fieldBuilder);
ilSetGenerator.Emit(OpCodes.Ret);
propertyBuilder.SetGetMethod(propertyGetter);
propertyBuilder.SetSetMethod(propertySetter);
}
}
var returnType = typeBuilder.CreateType();
return returnType;
タイプを取得したら、単純に ctor を取得してインスタンスで作成します
var ctor = entityType.GetConstructor(new Type[] { });
var instance = ctor.Invoke(new object[] { });
return instance;
コントローラー クラスでは、単純にモデルをビューに渡し、View(instance) を返します。ビュー itsel で、Html.EditorForModel() を呼び出します。