基本信息
源码名称:c# 动态扩展类型 示例源码
源码大小:3.46KB
文件格式:.txt
开发语言:C#
更新时间:2014-03-24
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
using System.Reflection; using System.CodeDom.Compiler; using System.Text; using Microsoft.CSharp; class sample { protected Type BuildExtendType(Type sourceType, PropertyInfo[] extenders) { StringBuilder codeBuilder = new StringBuilder(); CodeDomProvider comp = new CSharpCodeProvider(); CompilerParameters cp = new CompilerParameters(); codeBuilder.Append("using System;"); codeBuilder.Append("using Microsoft.JScript;"); codeBuilder.Append("public class ExtendObject{"); codeBuilder.Append(PrepareProperties(sourceType.GetProperties())); codeBuilder.Append(PrepareMappingProperties(extenders)); codeBuilder.Append("}"); cp.ReferencedAssemblies.Contains("System.dll"); cp.ReferencedAssemblies.Add("Microsoft.JScript.dll"); cp.GenerateExecutable = false; cp.GenerateInMemory = true; string code = codeBuilder.ToString(); CompilerResults cr = comp.CompileAssemblyFromSource(cp, code); if (cr.Errors.HasErrors) { string description = string.Empty; foreach (CompilerError e in cr.Errors) { description = e.ErrorText; } throw new Exception(description); } else { Assembly a = cr.CompiledAssembly; return a.GetType("ExtendObject"); } } protected string PrepareProperties(PropertyInfo[] ps) { StringBuilder sProperties = new StringBuilder(); foreach (PropertyInfo p in ps) { sProperties.Append("protected "); sProperties.Append(p.PropertyType.FullName); sProperties.Append(" "); sProperties.Append("_" p.Name); sProperties.Append(";"); sProperties.Append("public "); sProperties.Append(p.PropertyType.FullName); sProperties.Append(" "); sProperties.Append(p.Name); sProperties.Append("{get{return " "_" p.Name ";}set{" "_" p.Name "= value;}}"); } return sProperties.ToString(); } protected string PrepareMappingProperties(PropertyInfo[] ps) { //Samples: ITAB_BILL_TEMP_NAME StringBuilder sProperties = new StringBuilder(); foreach (PropertyInfo p in ps) { sProperties.Append("protected "); sProperties.Append(p.PropertyType.FullName); sProperties.Append(" "); sProperties.Append("_" p.DeclaringType.Name.Substring(11) "_" p.Name); sProperties.Append(";"); sProperties.Append("public "); sProperties.Append(p.PropertyType.FullName); sProperties.Append(" "); sProperties.Append(p.DeclaringType.Name.Substring(11) "_" p.Name); sProperties.Append("{get{return " "_" p.DeclaringType.Name.Substring(11) "_" p.Name ";}set{" "_" p.DeclaringType.Name.Substring(11) "_" p.Name " = value;}}"); } return sProperties.ToString(); } }