close

在把物件轉為 json 時想到的一個問題,如果可以依據特定條件把類別的某些 property 或 field 刪掉,這樣產生 json 字串時就不會包含一些無用的屬性,於是就順手研究如何動態的產生類別。

要動態產生類別,會需要下列幾個物件:

  • AssemblyBuilder
  • ModuleBuilder
  • TypeBuilder
  • FieldBuilder

有趣的是,上述幾個類別,使用時是有相依性的,請看以下程式碼:

            AssemblyName assemblyName = new AssemblyName();
            assemblyName.Name = "TestAssembly";

            AssemblyBuilder assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
            ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, assemblyName.Name + ".dll");
            
            TypeBuilder typeBuilder = moduleBuilder.DefineType("myNamespace.myType", TypeAttributes.Public);

            FieldBuilder myField1 = typeBuilder.DefineField("myField1",
                                                            typeof(string),
                                                            FieldAttributes.Public);
            FieldBuilder myField2 = typeBuilder.DefineField("myField2",
                                                            typeof(string),
                                                            FieldAttributes.Public);

            Type myType = typeBuilder.CreateType();

            Console.WriteLine("Type: {0}", myType.Name);
            Console.WriteLine("Namespace:{0}", myType.Namespace);
            Console.WriteLine("Fields:");
            foreach (FieldInfo field in myType.GetFields())
            {
                Console.WriteLine(field.Name);
            }

 

產生出來的類別,最後還能存成 dll 檔案,供其它程式使用。透過 reflection ,或許能讓物件的使用上更具彈性,只是這樣的使用方式,在效能上可能會造成更大的耗損。

arrow
arrow
    全站熱搜

    卑微研究生 發表在 痞客邦 留言(0) 人氣()