2012-12-07 15 views
8

Per memorizzare lo stato dei processi quando si è verificato un errore, desidero elencare tutti i dati (personalizzati) memorizzati in AppDomain (da SetData). La proprietà LocalStore è privata e la classe AppDomain non è ereditabile. Esiste un modo per enumerare tali dati?Elencare tutti i dati personalizzati memorizzati in AppDomain

+0

perché non si limitano a memorizzare tutte le informazioni chiavi (precedentemente impostato con SetData) in qualche collezione e dopo interrogazione GetData fro ogni chiave in questa collezione? – Tigran

+0

Stavo cercando una soluzione, in cui il processo non ha bisogno di utilizzare un'implementazione specifica. Dal momento che non penso sia possibile, il metodo di estensione per AppDomain che memorizza le chiavi è passato. Tks per la tua risposta. Se hai un altro indizio, non esitare. –

risposta

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

Bella soluzione. Grazie per la risposta. –

2

Sulla base Frank59's risposta, ma un po 'più conciso:

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

Stessa soluzione, ma come un metodo di estensione # F. Potrebbe non essere necessario il controllo nullo. 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 
Problemi correlati