用反射创建的对象和Html.EditorForModel()

时间:2012-09-21 07:29:24

标签: c# asp.net-mvc reflection razor asp.net-mvc-4

我有一组复杂的对象,它们是使用反射机制完全生成的,它们都实现了一个空接口。我想使用Html.EditorForModel()来显示对象字段的编辑器,但是现在我只能看到一个空页面。

如果我序列化其中一个对象,我在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(实例)。 在视图中我会调用Html.EditorForModel()。

0 个答案:

没有答案