前几天,师父给了一个任务,寻找借口来获取从TFS中获取的工作项的历史记录。深感为难,明明知道应该怎么做,可是找了两天API也没有找到!最后为自己的愚蠢行为深深地折服了,忘记了一个最最重要的东西--断点。
这就是获取到的WorkItem对象的数据结构,里面有什么一目了然了!
这里的testItem是WorkItem的一个对象,其中, testItem = workItemStore.GetWorkItem(findID, dt.AddSeconds(-1));可以获得当前项目前一秒种之前的一个WorkItem版本信息。这样逐个向前递推就可以取到所有的历史版本。
在testItem的属性中有一个叫做Fields,里面枚举了一个工作项的全部信息,从Fields[0]到Fields[50]一共51项。
同样的道理也可以获取到每个历史记录中的链接和附件的状态。
下面的代码分别是展现记录的内容和各个版本变化情况的逻辑,仅供参考:
/// <summary> /// 显示历史数据 /// </summary> /// <param name="testItem"></param> private static void DisplayFields(WorkItem testItem) { int FieldsLenth = testItem.Fields.Count; string writeValue = String.Empty;//字段内容 for (int i = 0; i < FieldsLenth; i++) { if ((testItem.Fields[i].Value == null) || (testItem.Fields[i].Value.ToString() == "")) { writeValue = "null"; } else { writeValue = testItem.Fields[i].Value.ToString(); } Console.WriteLine(testItem.Fields[i].Name + ":" + writeValue); } }
1 /// <summary> 2 /// 显示变化信息 3 /// </summary> 4 private static void DisplayChange() 5 { 6 int Length = staticWorkItems.Length; 7 int FieldsLenth = staticWorkItems[1].Fields.Count; 8 for (int i = 0; i < (Length-1); i++)//控制workItem的版本变化 9 { 10 for (int j = 0; j < FieldsLenth; j++)//控制检索内容向前 11 { 12 if (((staticWorkItems[i].Fields[j].Value == null) && (staticWorkItems[i + 1].Fields[j].Value != null)) && (staticWorkItems[i].Fields[j].Value == "") && (staticWorkItems[i + 1].Fields[j].Value != "")) 13 { 14 Console.WriteLine(staticWorkItems[i].Fields[j].Name + ":null" + 15 "->" + staticWorkItems[i + 1].Fields[j].Value); 16 } 17 else if (((staticWorkItems[i].Fields[j].Value != null) && (staticWorkItems[i + 1].Fields[j].Value != null)) && (staticWorkItems[i].Fields[j].Value.ToString() != staticWorkItems[i + 1].Fields[j].Value.ToString())) 18 {//先判断取出来的值是否为空,避免空异常 19 Console.WriteLine(staticWorkItems[i].Fields[j].Name + ":" + staticWorkItems[i].Fields[j].Value + 20 "->" + staticWorkItems[i + 1].Fields[j].Value); 21 } 22 23 } 24 DisplayAttachments(staticWorkItems[i]); 25 Console.WriteLine(""); 26 } 27 }