2012-12-07 8 views
8

Aby zapisać stan procesów w przypadku wystąpienia błędu, chciałbym wyświetlić wszystkie (niestandardowe) dane przechowywane w AppDomain (przez SetData). Właściwość LocalStore jest prywatna, a klasa AppDomain nie jest dziedziczna. Czy istnieje sposób na wyliczenie tych danych?Lista wszystkich niestandardowych danych przechowywanych w AppDomain

+0

dlaczego nie tylko przechowywać wszystkie klucze informacji (poprzednio ustawioną setData) W niektórych kolekcji i po zapytaniu GetData powrotem każdym kluczem w tej kolekcji? – Tigran

+0

Szukałem rozwiązania, w którym proces nie wymaga użycia konkretnej implementacji. Ponieważ nie wydaje mi się to możliwe, metoda rozszerzenia dla AppDomain, która przechowuje klucze przekazane. Tks za odpowiedź. Jeśli masz inną wskazówkę, nie zwlekaj. –

Odpowiedz

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

Ładne rozwiązanie. Dzięki za odpowiedź. –

2

podstawie Frank59's odpowiedzi, ale nieco bardziej zwięzła:

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

samo rozwiązanie, ale jako metodę rozszerzenia F #. Może nie wymagać sprawdzania zerowego. 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 
Powiązane problemy