C#在运行时动态创建类型的实现方法
本文实例讲述了C#在运行时动态创建类型的实现方法。是C#项目开发中很实用的技巧。分享给大家供大家参考。具体分析如下:
具体来说,C#在运行时动态的创建类型是通过动态生成C#源代码,然后通过编译器编译成程序集的方式实现动态创建类型的。
主要功能代码如下:
publicstaticAssemblyNewAssembly() { //创建编译器实例。 provider=newCSharpCodeProvider(); //设置编译参数。 cp=newCompilerParameters(); cp.GenerateExecutable=false; cp.GenerateInMemory=true; //Generateanexecutableinsteadof //aclasslibrary. //cp.GenerateExecutable=true; //Settheassemblyfilenametogenerate. cp.OutputAssembly="c:\\1.dll"; //Generatedebuginformation. cp.IncludeDebugInformation=true; //Savetheassemblyasaphysicalfile. cp.GenerateInMemory=false; //Setthelevelatwhichthecompiler //shouldstartdisplayingwarnings. cp.WarningLevel=3; //Setwhethertotreatallwarningsaserrors. cp.TreatWarningsAsErrors=false; //Setcompilerargumenttooptimizeoutput. 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"); //创建动态代码。 StringBuilderclassSource=newStringBuilder(); classSource.Append("usingSystem;usingSystem.Windows.Forms;\npublicclassDynamicClass:UserControl\n"); classSource.Append("{\n"); classSource.Append("publicDynamicClass()\n{\nInitializeComponent();\nConsole.WriteLine(\"hello\");}\n"); classSource.Append("privateSystem.ComponentModel.IContainercomponents=null;\nprotectedoverridevoidDispose(booldisposing)\n{\n"); classSource.Append("if(disposing&&(components!=null)){components.Dispose();}base.Dispose(disposing);\n}\n"); classSource.Append("privatevoidInitializeComponent(){\nthis.SuspendLayout();this.AutoScaleDimensions=newSystem.Drawing.SizeF(6F,12F);"); classSource.Append("this.AutoScaleMode=System.Windows.Forms.AutoScaleMode.Font;this.Name=\"DynamicClass\";this.Size=newSystem.Drawing.Size(112,74);this.ResumeLayout(false);\n}"); //创建属性。 /*************************在这里改成需要的属性******************************/ classSource.Append(propertyString("aaa")); classSource.Append(propertyString("bbb")); classSource.Append(propertyString("ccc")); classSource.Append("}"); System.Diagnostics.Debug.WriteLine(classSource.ToString()); //编译代码。 CompilerResultsresult=provider.CompileAssemblyFromSource(cp,classSource.ToString()); if(result.Errors.Count>0) { for(inti=0;i<result.Errors.Count;i++) Console.WriteLine(result.Errors[i]); Console.WriteLine("error"); returnnull; } //获取编译后的程序集。 Assemblyassembly=result.CompiledAssembly; returnassembly; } privatestaticstringpropertyString(stringpropertyName) { StringBuildersbProperty=newStringBuilder(); sbProperty.Append("privateint_"+propertyName+"=0;\n"); sbProperty.Append("publicint"+""+propertyName+"\n"); sbProperty.Append("{\n"); sbProperty.Append("get{return_"+propertyName+";}\n"); sbProperty.Append("set{_"+propertyName+"=value;}\n"); sbProperty.Append("}"); returnsbProperty.ToString(); }
希望本文所述对大家的C#程序设计有所帮助