2012-12-07 16 views
8

'da depolanan tüm özel verileri listele Bir hata oluştuğunda işlemlerin durumunu saklamak için, AppDomain'de (SetData) saklanan tüm (özel) verileri listelemek istiyorum. LocalStore özelliği özel ve AppDomain sınıfı devralınamaz. Bu verileri numaralandırmanın herhangi bir yolu var mı?AppDomain

+0

neden sadece bu koleksiyondaki her anahtarın fro bazı koleksiyonunda ve sorgu GetData sonra (daha önce SetData ile ayarlanır) tüm tuşlar bilgi deposu değildir? – Tigran

+0

Sürecin belirli bir uygulamayı kullanması gerekmediği bir çözüm arıyordum. Mümkün olduğunu düşünmüyorum, depolama anahtarları olan AppDomain için uzatma yöntemi geçti. Cevabınız için Tks. Başka bir ipucunuz varsa, çekinmeyin. –

cevap

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

Güzel çözüm. Cevap için teşekkürler. –

2

Frank59's cevap ama biraz daha özlü dayanarak:

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

aynı çözümü ancak bir F # uzantısı yöntemi olarak. Boş çeke ihtiyaç olmayabilir. 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 
İlgili konular