CodeDomHelper类初稿

mac2022-06-30  82

  1 using  System;   2 using  System.CodeDom;   3 using  System.CodeDom.Compiler;   4 using  Microsoft.CSharp;   5 using  System.IO;   6   7 namespace  CodeDomFacade   8 {  9    /**//// <summary> 10    /// 该类封装了CodeCom相关操作,方便外部使用 11    /// </summary> 12    public class CodeDomHelper 13    { 14 15        protected CodeCompileUnit _CodeRoot; 16        protected CodeNamespace _cn; 17        protected CodeDomProvider _provider; 18        protected string _strFileName; 19        protected CodeTypeDeclaration _ctdClass; 20 21        public CodeDomHelper() 22        { 23            _CodeRoot=new CodeCompileUnit(); 24            _ctdClass=new CodeTypeDeclaration(); 25        } 26 27        /**//// <summary> 28        /// 生成代码输出到文件 29        /// </summary> 30        public void GenerateCode() 31        { 32            try 33            { 34                // Obtain an ICodeGenerator from a CodeDomProvider class. 35                ICodeGenerator gen = _provider.CreateGenerator(); 36                // Create a TextWriter to a StreamWriter to an output file. 37                IndentedTextWriter tw = new IndentedTextWriter(new StreamWriter(_strFileName, false), "    "); 38                // Generate source code using the code generator. 39                gen.GenerateCodeFromCompileUnit(_CodeRoot, tw, new CodeGeneratorOptions()); 40                // Close the output file. 41                tw.Close(); 42            } 43            catch(System.Exception e) 44            { 45                throw e; 46            } 47        } 48 49        /**//// <summary> 50        /// 生成C#代码 51        /// </summary> 52        public void GenerateCSharpCode() 53        { 54            _provider=new CSharpCodeProvider();//设定生成代码为C#代码 55            GenerateCode();//生成代码,写入指定文件 56        } 57        /**//// <summary> 58        /// 设置代码命名空间 59        /// </summary> 60        /// <param name="name">命名空间名字</param> 61        public void DefineNameSpace(string name) 62        { 63            try 64            { 65                _cn=new CodeNamespace(name); 66                _CodeRoot.Namespaces.Add(_cn); 67            } 68            catch(System.Exception e) 69            { 70                throw e; 71            } 72        } 73 74        /**//// <summary> 75        /// 添加引用命名空间 76        /// </summary> 77        /// <param name="name">被引用命名空间名字</param> 78        public void AddImportNameSpace(string name) 79        { 80            try 81            { 82                _cn.Imports.Add(new CodeNamespaceImport(name)); 83            } 84            catch(System.Exception e) 85            { 86                throw e; 87            } 88        } 89 90        /**//// <summary> 91        /// 添加一个类 92        /// </summary> 93        /// <param name="classname">类名</param> 94        public void AddClass(string classname) 95        { 96            try 97            { 98                _ctdClass.Name=classname; 99                _cn.Types.Add(_ctdClass);100            }101            catch(System.Exception e)102            {103                throw e;104            }105        }106107        /**//// <summary>108        /// 添加一个方法到类109        /// </summary>110        /// <param name="methodname">方法名</param>111        /// <param name="returntype">返回值类型,如"System.Int32"</param>112        /// <param name="visit">访问控制类型"public" or "private"</param>113        public CodeMemberMethod AddMethod(string methodname,string returntype,string visit)114        {115            CodeMemberMethod cmm=new CodeMemberMethod();116            try117            {118                cmm.Name=methodname;119                cmm.ReturnType =new CodeTypeReference(returntype);120                switch(visit)121                {122                    case "public":123                        cmm.Attributes=MemberAttributes.Public|MemberAttributes.Final; 124                        break;125                    case "private":126                        cmm.Attributes=MemberAttributes.Private|MemberAttributes.Final; 127                        break;128                    default:129                        cmm.Attributes=MemberAttributes.Private|MemberAttributes.Final; 130                        break;131                }132            133                _ctdClass.Members.Add(cmm);134            }135            catch(System.Exception e)136            {137                throw e;138            }139            return cmm;140        }141142        /**//// <summary>143        /// 添加带有普通的get/set操作属性144        /// </summary>145        /// <param name="pname">属性名</param>146        /// <param name="returntype">返回值类型</param>147        /// <param name="visit">访问控制类型</param>148        /// <param name="fieldname">访问字段名</param>149        /// <returns>返回添加的属性,待以后操作,如添加原代码段</returns>150        public CodeMemberProperty AddProperty(string pname,string returntype,string visit,string fieldname)151        {    152            CodeMemberProperty cmp=new CodeMemberProperty();153            try154            {155                cmp.Name=pname;156                cmp.Type=new CodeTypeReference(returntype);157                switch(visit)158                {159                    case "public":160                        cmp.Attributes=MemberAttributes.Public|MemberAttributes.Final; 161                        break;162                    case "private":163                        cmp.Attributes=MemberAttributes.Private|MemberAttributes.Final; 164                        break;165                    default:166                        cmp.Attributes=MemberAttributes.Private|MemberAttributes.Final; 167                        break;168                }169                //添加get操作代码170                cmp.GetStatements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),fieldname)));171                //添加set操作代码172                cmp.SetStatements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),fieldname),new CodePropertySetValueReferenceExpression()));173                _ctdClass.Members.Add(cmp);174            }175            catch(System.Exception e)176            {177                throw e;178            }179            return cmp;180        }181182        /**//// <summary>183        /// 添加字段184        /// </summary>185        /// <param name="name">字段名</param>186        /// <param name="type">字段类型</param>187        /// <param name="visit">访问控制类型</param>188        /// <param name="IsCreateProperty">是否生成对应属性</param>189        public void AddField(string name,string type,string visit,bool IsCreateProperty)190        {191            CodeMemberField cmf=new CodeMemberField(type,name);192            try193            {194                switch(visit)195                {196                    case "public":197                        cmf.Attributes=MemberAttributes.Public|MemberAttributes.Final; 198                        break;199                    case "private":200                        cmf.Attributes=MemberAttributes.Private|MemberAttributes.Final; 201                        break;202                    default:203                        cmf.Attributes=MemberAttributes.Private|MemberAttributes.Final; 204                        break;205                }206                _ctdClass.Members.Add(cmf);207                if(IsCreateProperty)208                {209                    if(name.IndexOf("_")>0)210                        AddProperty(name.Replace("_",""),type,"public",name);211                    else212                        AddProperty("p" + name,type,"public",name);213                }214            }215            catch(System.Exception e)216            {217                throw e;218            }219        }220221        /**//// <summary>222        /// 从指定文件获取代码223        /// </summary>224        /// <param name="filename">文件路径(包含名称)</param>225        /// <returns></returns>226        public string GetCodeFormFile(string filename)227        {228            try229            {230                StreamReader sr = new StreamReader(filename);231                string result = sr.ReadToEnd();//读取文件内容到文本框232                sr.Close();233                return result;234            }235            catch(System.Exception e)236            {237                throw e;238                return "读取文件出错";239            }240        }241242        /**//// <summary>243        /// 添加原代码片断244        /// </summary>245        /// <param name="cmm">要添加的地方,如方法,入口点,结构等</param>246        /// <param name="strCode">具体代码</param>247        public void AddCodeSnippet(CodeMemberMethod cmm,string strCode)248        {249            try250            {251                CodeSnippetStatement codebody = null;252                codebody = new CodeSnippetStatement(strCode);253                cmm.Statements.Add(codebody);254            }255            catch(System.Exception e)256            {257                throw e;258            }259        }260        相关属性#region 相关属性261        /**//// <summary>262        /// 代码提供容器263        /// </summary>264        public CodeCompileUnit CodeRoot265        {266            get267            {268                return _CodeRoot;269            }270            set271            {272                _CodeRoot=value;273            }274        }275276        /**//// <summary>277        /// 代码名字空间278        /// </summary>279        public CodeNamespace cn280        {281            get282            {283                return _cn;284            }285            set286            {287                _cn=value;288            }289        }290291        /**//// <summary>292        /// 代码类型提供者293        /// </summary>294        public CodeDomProvider provider295        {296            get297            {298                return _provider;299            }300            set301            {302                _provider=value;303            }304        }305306        /**//// <summary>307        /// 生成代码文件名308        /// </summary>309        public string strFileName310        {311            get312            {313                return _strFileName;314            }315            set316            {317                _strFileName=value;318            }319        }320        #endregion         321    }322} 323 最近在看CodeDom,发现其类层次很多,而且很复杂,所以写了一个Farade模式的类,希望在以后的开发中简化使用CodeDom,但由于时间有限,所以功能不够完善,也许要在以后使用中不断完善。

转载于:https://www.cnblogs.com/spgoal/archive/2005/10/31/265845.html

相关资源:招商会初稿.
最新回复(0)