Um den Status von Prozessen zu speichern, wenn ein Fehler auftrat, möchte ich alle (benutzerdefinierten) Daten auflisten, die in AppDomain (von SetData) gespeichert sind. Die LocalStore-Eigenschaft ist privat und die AppDomain-Klasse nicht vererbbar. Gibt es eine Möglichkeit, diese Daten aufzuzählen?Auflisten aller in AppDomain gespeicherten benutzerdefinierten Daten
8
A
Antwort
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
Schöne Lösung. Danke für die Antwort. –
2
Basierend auf Frank59's Antwort, aber ein bisschen mehr prägnant:
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
Gleiche Lösung, sondern als Fis-Extension-Methode. Möglicherweise wird der Null-Check nicht benötigt. 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
warum speichern nicht nur alle Tasten Informationen (vorher mit SetData gesetzt) in irgendeiner Sammlung und nach Abfrage GetData fro jeder Schlüssel in dieser Sammlung? – Tigran
Ich suchte nach einer Lösung, bei der der Prozess keine spezifische Implementierung benötigt. Da ich denke nicht, dass es möglich ist, Erweiterung Methode für AppDomain, die Schlüssel übergeben wird. Tks für deine Antwort. Wenn Sie einen anderen Hinweis haben, zögern Sie nicht. –