2012-12-07 24 views
8

में संग्रहीत सभी कस्टम डेटा सूचीबद्ध करें जब कोई त्रुटि हुई, प्रक्रियाओं की स्थिति को संग्रहीत करने के लिए, मैं AppDomain (SetData द्वारा) में संग्रहीत सभी (कस्टम) डेटा सूचीबद्ध करना चाहता हूं। लोकलस्टोर संपत्ति निजी है और ऐपडोमेन क्लास विरासत योग्य नहीं है। क्या उन आंकड़ों की गणना करने का कोई तरीका है?AppDomain

+0

क्यों बस कुछ संग्रह में और क्वेरी GetData के बाद कि संग्रह में हर कुंजी इधर-उधर सभी कुंजियों जानकारी (पहले SetData के साथ सेट) की दुकान नहीं है? – Tigran

+0

मैं एक समाधान की तलाश में था, जहां प्रक्रिया को एक विशिष्ट कार्यान्वयन का उपयोग करने की आवश्यकता नहीं है। चूंकि मुझे नहीं लगता कि यह संभव है, ऐपडॉमेन के लिए विस्तार विधि जो कि कुंजी जमा कर रही है। आपके उत्तर के लिए 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

एक ही समाधान है, लेकिन एक एफ # विस्तार विधि के रूप में। शून्य जांच की आवश्यकता नहीं हो सकती है। 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