C#在運(yùn)行時動態(tài)創(chuàng)建類型的實(shí)現(xiàn)方法
本文實(shí)例講述了C#在運(yùn)行時動態(tài)創(chuàng)建類型的實(shí)現(xiàn)方法。是C#項(xiàng)目開發(fā)中很實(shí)用的技巧。分享給大家供大家參考。具體分析如下:
具體來說,C# 在運(yùn)行時動態(tài)的創(chuàng)建類型是通過動態(tài)生成C#源代碼,然后通過編譯器編譯成程序集的方式實(shí)現(xiàn)動態(tài)創(chuàng)建類型的。
主要功能代碼如下:
public static Assembly NewAssembly() { //創(chuàng)建編譯器實(shí)例。 provider = new CSharpCodeProvider(); //設(shè)置編譯參數(shù)。 cp = new CompilerParameters(); cp.GenerateExecutable = false; cp.GenerateInMemory = true; // Generate an executable instead of // a class library. //cp.GenerateExecutable = true; // Set the assembly file name to generate. cp.OutputAssembly = "c:\\1.dll"; // Generate debug information. cp.IncludeDebugInformation = true; // Save the assembly as a physical file. cp.GenerateInMemory = false; // Set the level at which the compiler // should start displaying warnings. cp.WarningLevel = 3; // Set whether to treat all warnings as errors. cp.TreatWarningsAsErrors = false; // Set compiler argument to optimize output. cp.CompilerOptions = "/optimize"; cp.ReferencedAssemblies.Add("System.dll"); //cp.ReferencedAssemblies.Add("System.Core.dll"); cp.ReferencedAssemblies.Add("System.Data.dll"); //cp.ReferencedAssemblies.Add("System.Data.DataSetExtensions.dll"); cp.ReferencedAssemblies.Add("System.Deployment.dll"); cp.ReferencedAssemblies.Add("System.Design.dll"); cp.ReferencedAssemblies.Add("System.Drawing.dll"); cp.ReferencedAssemblies.Add("System.Windows.Forms.dll"); //創(chuàng)建動態(tài)代碼。 StringBuilder classSource = new StringBuilder(); classSource.Append("using System;using System.Windows.Forms;\npublic class DynamicClass: UserControl \n"); classSource.Append("{\n"); classSource.Append("public DynamicClass()\n{\nInitializeComponent();\nConsole.WriteLine(\"hello\");}\n"); classSource.Append( "private System.ComponentModel.IContainer components = null;\nprotected override void Dispose(bool disposing)\n{\n"); classSource.Append( "if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);\n}\n"); classSource.Append( "private void InitializeComponent(){\nthis.SuspendLayout();this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);"); classSource.Append( "this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;this.Name = \"DynamicClass\";this.Size = new System.Drawing.Size(112, 74);this.ResumeLayout(false);\n}"); //創(chuàng)建屬性。 /*************************在這里改成需要的屬性******************************/ classSource.Append(propertyString("aaa")); classSource.Append(propertyString("bbb")); classSource.Append(propertyString("ccc")); classSource.Append("}"); System.Diagnostics.Debug.WriteLine(classSource.ToString()); //編譯代碼。 CompilerResults result = provider.CompileAssemblyFromSource(cp, classSource.ToString()); if (result.Errors.Count > 0) { for( int i = 0; i < result.Errors.Count; i ++) Console.WriteLine(result.Errors[ i]); Console.WriteLine("error"); return null; } //獲取編譯后的程序集。 Assembly assembly = result.CompiledAssembly; return assembly; } private static string propertyString(string propertyName) { StringBuilder sbProperty = new StringBuilder(); sbProperty.Append(" private int _" + propertyName + " = 0;\n"); sbProperty.Append(" public int " + "" + propertyName + "\n"); sbProperty.Append(" {\n"); sbProperty.Append(" get{ return _" + propertyName + ";} \n"); sbProperty.Append(" set{ _" + propertyName + " = value; }\n"); sbProperty.Append(" }"); return sbProperty.ToString(); }
希望本文所述對大家的C#程序設(shè)計(jì)有所幫助
相關(guān)文章
C# ArrayList、HashSet、HashTable、List、Dictionary的區(qū)別詳解
這篇文章主要介紹了C# ArrayList、HashSet、HashTable、List、Dictionary的區(qū)別的相關(guān)知識點(diǎn)內(nèi)容,有需要朋友們參考下。2019-08-08C#實(shí)現(xiàn)的4種常用數(shù)據(jù)校驗(yàn)方法小結(jié)(CRC校驗(yàn),LRC校驗(yàn),BCC校驗(yàn),累加和校驗(yàn))
本文主要介紹了C#實(shí)現(xiàn)的4種常用數(shù)據(jù)校驗(yàn)方法小結(jié)(CRC校驗(yàn),LRC校驗(yàn),BCC校驗(yàn),累加和校驗(yàn)),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03C#利用反射實(shí)現(xiàn)多數(shù)據(jù)庫訪問
本文詳細(xì)講解了C#利用反射實(shí)現(xiàn)多數(shù)據(jù)庫訪問的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03C#實(shí)現(xiàn)漢字轉(zhuǎn)區(qū)位碼的示例代碼
區(qū)位碼是一個4位的十進(jìn)制數(shù),每個區(qū)位碼都對應(yīng)著一個唯一的漢字,區(qū)位碼的前兩位叫做區(qū)碼,后兩位叫做位碼,下面我們就來看看如何使用C#實(shí)現(xiàn)漢字轉(zhuǎn)區(qū)位碼吧2024-01-01C# Soap調(diào)用WebService的實(shí)例
下面小編就為大家?guī)硪黄狢# Soap調(diào)WebService的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12