亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

x01.CodeBuilder:生成代碼框架

2019-11-14 13:41:32
字體:
來源:轉載
供稿:網友

根據 Assembly 生成代碼框架。

這是學習 AvalonEdit 的一個副產品。學習時,照著源代碼新建文件夾,新建文件,添加方法與屬性,雖然只是個框架,也要花費大量時間。為什么不讓它自動生成呢?于是,新建了個控制臺程序,一步步添加,一步步顯示,一步步調整。雖然還有許多不完善的地方,但它基本能用了。將 Main 方法略作改動,便成了 Build 方法。為操作方便,加了個 WPF 界面。OK!下一步可參照 ILSpy 來進行改寫,當也是一款不錯的工具吧。限于時間與能力,暫且作罷。

主要代碼如下:

  1 /**  2  * PRogram.cs (c) 2015 by x01  3  */  4 using System;  5 using System.Collections.Generic;  6 using System.Diagnostics;  7 using System.IO;  8 using System.Linq;  9 using System.Reflection; 10 using System.Text; 11 using System.Text.RegularExpressions; 12 using System.Windows; 13  14 namespace x01.CodeBuilder 15 { 16     public class Test<THllo> 17     { 18          19     } 20     /// <summary> 21     /// Description of Program. 22     /// </summary> 23     public static  class BuildHelper 24     { 25         static readonly StringBuilder sb = new StringBuilder(); 26         static readonly List<string> usings = new List<string>(); 27         static string headerFormat = "/**/n * {0}.cs (c) 2015 by x01/n *//n"; 28          29         /// <summary> 30         /// 根據 Assebmly 生成代碼框架。 31         /// </summary> 32         /// <param name="path">程序集路徑名</param> 33         /// <param name="outputDirectory">輸出目錄</param> 34         public static void Build(string path, string outputDirectory) 35         { 36             if (!File.Exists(path)) { 37                 throw new Exception("Assembly file not found."); 38             } 39             if (!Directory.Exists(outputDirectory)) { 40                 Directory.CreateDirectory(outputDirectory); 41             } 42              43             Assembly assembly = Assembly.LoadFile(path); 44             string assemblyName = assembly.FullName.Split(',')[0]; 45              46             string assemblyPath = Path.GetDirectoryName(assembly.Location); 47             foreach (var type in assembly.GetTypes()) { 48                 usings.Clear(); 49                  50                 if (!(type.IsEnum || type.IsClass || type.IsInterface || type.IsGenericType)) { 51                     continue; 52                 } 53                  54                 string typeName = type.FullName.Replace(assemblyName + ".",""); 55                  56                 string[] typeNameSplits = typeName.Split('.'); 57                 string fileDirectory = outputDirectory; 58                 if (typeNameSplits.Length > 1) { 59                     for (int i = 0; i < typeNameSplits.Length - 1; i++) { 60                         fileDirectory += "//" + typeNameSplits[i]; 61                         if (!Directory.Exists(fileDirectory)) { 62                             Directory.CreateDirectory(fileDirectory); 63                         } 64                     } 65                 } 66                  67                 sb.Clear(); 68                 int lastDotIndex = type.FullName.LastIndexOf('.'); 69                 string namespaceName = lastDotIndex > 0 ? type.FullName.Substring(0,lastDotIndex) : type.FullName; 70                  71                 sb.Append("namespace " + namespaceName + "/n{/n"); 72                  73                 string convertName = ConvertType(type.Name);  74                 sb.Append("/t//TODO: " + convertName + "/n"); 75              76                 if (type.IsPublic) { 77                     sb.Append("/tpublic "); 78                 } else { 79                     sb.Append("/t"); 80                 } 81                  82                 if (type.IsAbstract && !type.IsInterface) { 83                     sb.Append("abstract "); 84                 } else if (type.IsSealed && !type.IsEnum) { 85                     sb.Append("sealed "); 86                 } 87                  88                 if (type.IsEnum) { 89                     sb.Append("enum "); 90                 } else if (type.IsClass) { 91                     sb.Append("class "); 92                 } else if (type.IsInterface) { 93                     sb.Append("interface "); 94                 } 95                  96                 sb.Append(convertName);  97                 if (type.BaseType != null && !string.IsNullOrEmpty(type.BaseType.Name)) { 98                     sb.Append(" : " + ConvertType(type.BaseType.Name)); 99                 }100                 sb.Append("/n/t{/n");101                 102                 var baseProperties = type.BaseType != null ? type.BaseType.GetProperties() : new PropertyInfo[1];103                 foreach (var property in type.GetProperties()) {104                     if (type.IsEnum) continue;105                     106                     var propertyString = property.ToString();107                     bool skip = false;108                     foreach (var bp in baseProperties) {109                         if (bp == null) continue;110                         if (propertyString == bp.ToString()) {111                             skip = true;112                             break;113                         }114                     }115                     if (skip) continue;116                     117                     int lastIndex = propertyString.LastIndexOf('.');118                     string propu = string.Empty;119                     if (lastIndex >= 0)120                         propu = propertyString.Substring(0,lastIndex);121                     propu = ConvertType(propu);122                     if (!usings.Contains(propu) && !string.IsNullOrEmpty(propu)) {123                         usings.Add(propu);124                     }125                     string p = propertyString.Substring(lastIndex+1);126                     string[] ps = p.Split(' ');127                     ps[0] = ConvertType(ps[0]) + " ";128                     p = string.Empty;129                     for (int i = 0; i < ps.Length; i++) {130                         p += ps[i];131                     }132                     sb.Append("/t/tpublic " + p + " { get; set; }/n");133                 }134     135                 sb.Append("/n");136                 137                 var baseMethods =  type.BaseType != null ? type.BaseType.GetMethods() : new MethodInfo[1];138                 foreach (var method in type.GetMethods()) {139                     if (type.IsEnum) continue;140                     141                     bool skip = false;142                     foreach (var bm in baseMethods) {143                         if (bm == null) break;144                         if (bm.ToString() == method.ToString()) {145                             skip = true;146                             break;147                         }148                     }149                     if (skip) continue;150                     151                     var typeString = method.ReturnType.ToString();152                     if (method.Name.Contains("get_") || method.Name.Contains("set_") 153                         || method.Name.Contains("add_") || method.Name.Contains("remove_")) {154                         continue;155                     }156                     int lastIndex = typeString.LastIndexOf('.');157                     string r = string.Empty;158                     if (lastIndex > 0) {159                         string u = typeString.Substring(0,lastIndex);160                         u = ConvertType(u);161                         if (!usings.Contains(u) && !string.IsNullOrEmpty(u)) {162                             usings.Add(u);163                         }164                         r = typeString.Substring(lastIndex+1);165                     } else {166                         r = typeString;167                     }168                     r = ConvertType(r);169                     sb.Append("/t/tpublic " + r + " " + method.Name + "(");170                     int pcount = method.GetParameters().Length;171                     int count = 0;172                     foreach (var parameter in method.GetParameters()) {173                         var paramString = parameter.ParameterType.ToString();174                         int plast = paramString.LastIndexOf('.');175                         string ptype = string.Empty;176                         if (plast > 0) {177                             string pu = paramString.Substring(0, plast);178                             pu = ConvertType(pu);179                             if (!usings.Contains(pu)) {180                                 usings.Add(pu);181                             }182                             ptype = paramString.Substring(plast+1);183                         } else {184                             ptype = paramString;185                         }186                         ptype = ConvertType(ptype);187                         count ++;188                         if (pcount == 1 || pcount == count)189                             sb.Append(ptype + " " + parameter.Name);190                         else 191                             sb.Append(ptype + " " + parameter.Name + ", ");192                     }193                     sb.Append(")/n");194                     sb.Append("/t/t{/n/t/t/tthrow new NotImplementedException();/n/t/t}/n");195                 }196                 197                 sb.Append("/t}/n"); // end type198                 199                 sb.Append("}"); //end namespace200                 201                 string header = string.Format(headerFormat, convertName);202                 string ustring = header;203                 foreach (var us in usings) {204                     ustring += "using " + us + ";/n";205                 }206                 ustring += "/n" + sb.ToString();207 208                 if (!string.IsNullOrEmpty(convertName)) {209                     string filename = Path.Combine(fileDirectory, convertName) + ".cs";210                     File.WriteAllText(filename, ustring);211                 }212             }213         }214         215         static string ConvertType(string typeName)216         {217             int index = typeName.IndexOf('`');218             if (index >= 0)219                 typeName = typeName.Substring(0,index);220             index = typeName.IndexOf('+');221             if (index >= 0) 222                 typeName = typeName.Substring(0,index);223             index = typeName.IndexOf('<');224             if (index >= 0)225                 typeName = typeName.Substring(0,index);226             index = typeName.IndexOf(']');227             if (index >= 0)228                 typeName = typeName.Substring(0, index);229             230             switch (typeName) {231                 case "Boolean":232                     return "bool";233                 case "Void":234                     return "void";235                 case "Int32":236                     return "int";237                 case "Object":238                     return "object";239                 case "Double":240                     return "double";241                 case "String":242                     return "string";243                 case "Long":244                     return "long";245                 default:246                     break;247             }248             249             return typeName;250         }251         252         // 測試用的。253 //        static void Main(string[] args)254 //        {255 //            string path = @"E:/Temp/Lab/x01/x01.CodeBuilder/bin/Debug/x01.MelonEdit.exe";256 //            string target = @"E:/Temp/Lab/x01/Output";257 //            Build(path,target);258 //            259 //            Console.ReadKey(true);260 //        }261     }262 }
View Code

看一看,真是慘不忍睹。這大概就是所謂的意大利面條吧。

源代碼下載:https://github.com/chinax01/x01.CodeBuilder


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91在线观看免费高清完整版在线观看| 在线播放国产精品| 精品美女久久久久久免费| 久久久久久久久久久免费| 国产精品香蕉av| 国产精品久久久久久久久久小说| 欧美肥老太性生活视频| 欧美剧在线观看| 91高清在线免费观看| 日本乱人伦a精品| 亚洲www视频| 国产精品久久久久久久久久尿| 亚洲综合中文字幕在线| 91精品国产综合久久久久久久久| 欧美激情二区三区| 欧美丰满老妇厨房牲生活| 国产精品久久久久久久app| 亚洲最大av在线| 久久久久久噜噜噜久久久精品| 久久夜精品va视频免费观看| 亚洲欧美制服综合另类| 日韩女优人人人人射在线视频| 在线观看91久久久久久| 欧美自拍大量在线观看| 国产欧美精品va在线观看| 精品国产一区二区三区久久狼5月| 欧美成人午夜影院| 日韩电视剧免费观看网站| 国产精品免费一区二区三区都可以| 久久久久久九九九| 久久成人亚洲精品| 精品爽片免费看久久| 亚洲最大福利视频网| 韩国日本不卡在线| 国产精品亚洲激情| 国产91成人在在线播放| 国内成人精品一区| 国内揄拍国内精品| 中文综合在线观看| 91免费国产网站| 欧美日韩国产成人在线| 欧美精品在线免费播放| 久久久久亚洲精品| 欧美日韩美女在线| 久久噜噜噜精品国产亚洲综合| 国产在线观看不卡| 亚洲天堂成人在线| 1769国产精品| 亚洲午夜未删减在线观看| 久久综合88中文色鬼| 国产日韩欧美中文| 91久久久久久久一区二区| 国产精品久久久久久久午夜| 国产精品女主播视频| 中文字幕日韩欧美精品在线观看| 综合国产在线视频| 中文字幕亚洲第一| 国产日韩欧美在线播放| 国产日韩欧美日韩| 中文字幕在线看视频国产欧美在线看完整| 日韩动漫免费观看电视剧高清| 欧美精品日韩三级| 亚洲图片欧洲图片av| 伊人伊成久久人综合网站| 久久久伊人日本| 欧美成人精品不卡视频在线观看| 亚洲va久久久噜噜噜| 欧美激情成人在线视频| 自拍偷拍亚洲欧美| 亚洲人午夜精品免费| 久久人人97超碰精品888| 欧美激情精品久久久久久久变态| 欧美在线性爱视频| 日韩av影院在线观看| 久久久久久久国产精品视频| 日韩av免费一区| 亚洲福利在线看| 亚洲视频在线看| 精品久久久久国产| 国产精品久久久久久一区二区| 亚洲欧洲一区二区三区在线观看| 97视频在线观看免费高清完整版在线观看| 亚洲免费人成在线视频观看| 麻豆国产va免费精品高清在线| 久久综合久久美利坚合众国| 色偷偷噜噜噜亚洲男人的天堂| 国产精品九九久久久久久久| 日韩中文字幕精品| 久热精品视频在线观看| 亚洲xxxxx电影| 日本欧美爱爱爱| 自拍亚洲一区欧美另类| 亚洲永久在线观看| 成人综合国产精品| 亚洲第一区第一页| 亚洲xxx视频| 亚洲激情在线观看视频免费| 国产成人激情视频| 国产精品吊钟奶在线| 日韩精品小视频| 精品福利视频导航| 欧美高清一级大片| 国产精品日韩久久久久| 91精品国产色综合久久不卡98口| 国产精品日日做人人爱| 亚洲精品久久久久| 亚洲欧美成人精品| 国产在线精品自拍| 亚洲免费视频网站| 欧美另类69精品久久久久9999| www日韩中文字幕在线看| 中文字幕亚洲欧美日韩在线不卡| 亚洲欧美日韩中文在线制服| 亚洲色无码播放| 国产福利精品av综合导导航| 日韩电影中文字幕一区| 91精品国产自产91精品| 亚洲日韩欧美视频一区| 国产欧美精品日韩| xxxx性欧美| 懂色av一区二区三区| 最近2019中文字幕大全第二页| 日韩中文av在线| 国产精品电影久久久久电影网| 欧美精品做受xxx性少妇| 日韩在线免费视频| 日韩av在线免费观看| 日本道色综合久久影院| 欧美日韩福利电影| 欧美激情区在线播放| 成人a在线观看| 久久夜色精品国产欧美乱| 欧美自拍大量在线观看| 97久久精品国产| 亚洲国语精品自产拍在线观看| 国产aⅴ夜夜欢一区二区三区| 亚洲女人被黑人巨大进入al| 欧美视频在线免费| 国产精品高精视频免费| 久久天堂av综合合色| 欧美日韩中文字幕| 亚洲国产精品999| 国产成人拍精品视频午夜网站| 欧美日韩国产丝袜另类| 97**国产露脸精品国产| 国产999视频| 亚洲免费伊人电影在线观看av| 精品日韩美女的视频高清| 日韩精品欧美激情| 欧美成人午夜剧场免费观看| 成人国产精品免费视频| 国产一区二区欧美日韩| 91大神在线播放精品| 伊人伊成久久人综合网小说| 欧美日韩国产91| 亚洲伦理中文字幕| 国产精品视频自在线| 九九视频这里只有精品| y97精品国产97久久久久久| 国产成人精品免高潮费视频| 精品激情国产视频| 欧美精品久久久久久久免费观看| 国产午夜精品全部视频播放| 亚洲精品国精品久久99热一|