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#程序设计有所帮助