2012-12-07 65 views
8

爲了在發生錯誤時存儲進程的狀態,我想列出存儲在AppDomain中的所有(自定義)數據(通過SetData)。 LocalStore屬性是私有的,AppDomain類不可繼承。 有什麼辦法來枚舉這些數據?列出存儲在AppDomain中的所有自定義數據

+0

爲什麼不只是存儲在一些收集和查詢的GetData來回後,該集合在每一個關鍵的所有鍵的信息(先前的SetData設置)? – Tigran

+0

我正在尋找一個解決方案,其中的過程不需要使用特定的實現。由於我不認爲這是可能的,因此存儲密鑰的AppDomain的擴展方法已通過。 Tks爲您的答覆。如果你有另一個線索,請不要猶豫。 –

回答

5
 AppDomain domain = AppDomain.CurrentDomain; 
     domain.SetData("testKey", "testValue"); 

     FieldInfo[] fieldInfoArr = domain.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance); 
     foreach (FieldInfo fieldInfo in fieldInfoArr) 
     { 

      if (string.Compare(fieldInfo.Name, "_LocalStore", true) != 0) 
       continue; 
      Object value = fieldInfo.GetValue(domain); 
      if (!(value is Dictionary<string,object[]>)) 
       return; 
      Dictionary<string, object[]> localStore = (Dictionary<string, object[]>)value; 
      foreach (var item in localStore) 
      { 
       Object[] values = (Object[])item.Value; 
       foreach (var val in values) 
       { 
        if (val == null) 
         continue; 
        Console.WriteLine(item.Key + " " + val.ToString()); 
       } 
      } 


     } 
+0

不錯的解決方案。感謝您的回覆。 –

2

基於Frank59's答案,但有點更簡潔:

var appDomain = AppDomain.CurrentDomain; 
var flags = BindingFlags.NonPublic | BindingFlags.Instance; 
var fieldInfo = appDomain.GetType().GetField("_LocalStore", flags); 
if (fieldInfo == null) 
    return; 
var localStore = fieldInfo.GetValue(appDomain) as Dictionary<string, object[]>; 
if (localStore == null) 
    return; 
foreach (var key in localStore.Keys) 
{ 
    var nonNullValues = localStore[key].Where(v => v != null); 
    Console.WriteLine(key + ": " + string.Join(", ", nonNullValues)); 
} 
1

相同的溶液,但作爲一個F#擴展方法。可能不需要空檢查。 https://gist.github.com/ctaggart/30555d3faf94b4d0ff98

type AppDomain with 
    member x.LocalStore 
     with get() = 
      let f = x.GetType().GetField("_LocalStore", BindingFlags.NonPublic ||| BindingFlags.Instance) 
      if f = null then Dictionary<string, obj[]>() 
      else f.GetValue x :?> Dictionary<string, obj[]> 

let printAppDomainObjectCache() = 
    for KeyValue(k,v) in AppDomain.CurrentDomain.LocalStore do 
     printfn "%s" k 
相關問題