需求分析:很多时候,我们不经意的经常要写一些测试方法,然而每次花时间都去新建一个项目,显然非常浪费时间。下面我针对测试项目需求,做了一个小型的测试项目,以供经常对一些方法和类做测试使用的项目来使用。
ITest接口:
//模拟普通启动的入口,至于更多的扩展功能,可以在这里定义。例如自带测试数据等.
public interface ITest
{
void Main(string[] args); }在该项目下建立一个myClass类:
public class myClass:ITest
{ public void Main(string[] args) { Console.WriteLine("接口函数调用!"); } }由于我们每建立一个类,他都有一个新的特定就是,文件的时间是最新的,所以利用这个特性我们写个搜索的方法:
/// <summary> /// 获取最新的项目.cs文件,并且满足继承ITest接口 /// </summary> /// <param name="diWorkPlace">工作目录</param> /// <param name="StrPram">搜索条件</param> /// <returns>最新的文件.cs,并且满足继承ITest接口</returns> private static FileInfo GetLastFile(DirectoryInfo diWorkPlace,string StrPram) { FileInfo lastf=null; DirectoryInfo[] dis = diWorkPlace.GetDirectories(); for (int i = 0; i < dis.Length; i++) { FileInfo tfi = GetLastFile(dis[i], StrPram); if (tfi==null) { continue; } if (lastf == null || tfi.LastWriteTime > lastf.LastWriteTime) { if (isWant(tfi)) { lastf = tfi; } } } FileInfo[] fis = diWorkPlace.GetFiles(StrPram); for (int i = 0; i < fis.Length; i++) { if (lastf == null||fis[i].LastWriteTime > lastf.LastWriteTime) { if (isWant(fis[i])) { lastf = fis[i]; } } } return lastf; } /// <summary> /// 是否为需要的文件,在GetLastFile文件要用到 /// </summary> /// <param name="lastFile">传入要做判断的文件</param> /// <returns>是为需要的</returns> private static bool isWant(FileInfo lastFile) { bool flg = false; string[] codes = File.ReadAllLines(lastFile.FullName, Encoding.Default); for (long i = 0; i < codes.LongLength; i++) { if (codes[i].Contains("namespace")) { for (long j = i + 1; j < codes.LongLength; j++) { if ( codes[j].Contains("ITest")&&codes[j].Contains("class") ) { int ib = codes[j].IndexOf("class"); int ie = codes[j].IndexOf("ITest"); if (ie>ib) { flg = true; } } } break; } } return flg; }
以上完成后,我们需要对该文件的里面类人进行筛选,得到全命名空间,以共反射使用:
/// <summary>
/// 返回符合ITest接口的全空间名称 /// </summary> /// <param name="lastFile">最新的文件</param> /// <returns>命名空间名称</returns> private static string getFullName(FileInfo lastFile) { string FullName = ""; string[] codes = File.ReadAllLines(lastFile.FullName, Encoding.Default); string NameSapce = ""; string ClassName = ""; for (long i = 0; i < codes.LongLength; i++) { if (codes[i].Contains("namespace")) { NameSapce = codes[i].Replace("namespace", "").Trim(); for (long j = i + 1; j < codes.LongLength; j++) { if (codes[j].Contains("ITest") && codes[j].Contains("class")) { int ib = codes[j].IndexOf("class") + 6; int ie = codes[j].IndexOf(":"); ClassName = codes[j].Substring(ib, ie - ib).Trim(); FullName = NameSapce + "." + ClassName; } } break; } } return FullName; }以上都是为下面的主函数做铺垫:
public class Program
{ public static void Main(string[] args){
Console.ForegroundColor = ConsoleColor.Yellow;
DirectoryInfo di = new DirectoryInfo(Directory.GetCurrentDirectory()); DirectoryInfo diWorkPlace = di.Parent.Parent; FileInfo lastFile = GetLastFile(diWorkPlace, "*.cs"); string ClassFullName = getFullName(lastFile); var asm = Assembly.GetEntryAssembly(); var typ = asm.GetType(ClassFullName); ITest instance = (ITest)asm.CreateInstance(ClassFullName); var method = typ.GetMethod("Main"); instance.Main(args); }}
总结:通过上面的主函数代码的实现,就可以实现只要一新建一个类实现ITest就可以智能的进入最新的类做测试了。