Thomas Darimont
Erfahrenes Mitglied
Hallo,
hier mal ein kleines Beispiel wie man Instanzen von als internal definierten (generischen) Typen erzeugen kann am Beispiel des System.Collections.Generic.TreeSet<T>.
Das System.Collections.Generic.TreeSet ist ein interner Typ der u.a. von System.Collections.Generic.SortedDictionary<TKey, TValue> zur Implementierung der Schlüsselspeicherung verwendet wird. Diese ist dort mit KeyValuePair<TKey, TValue> getemplated... will man nun (aus welchen Gründen auch immer) eine eigene entsprechend getemplated-te (was für ein Wort...) Instanz erzeugen, so kann man sich dem unten gezeigten Trick bedienen...
Ausgabe:
Gruß Tom
hier mal ein kleines Beispiel wie man Instanzen von als internal definierten (generischen) Typen erzeugen kann am Beispiel des System.Collections.Generic.TreeSet<T>.
Das System.Collections.Generic.TreeSet ist ein interner Typ der u.a. von System.Collections.Generic.SortedDictionary<TKey, TValue> zur Implementierung der Schlüsselspeicherung verwendet wird. Diese ist dort mit KeyValuePair<TKey, TValue> getemplated... will man nun (aus welchen Gründen auch immer) eine eigene entsprechend getemplated-te (was für ein Wort...) Instanz erzeugen, so kann man sich dem unten gezeigten Trick bedienen...
C#:
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace Training
{
public class CollectionTest
{
public static void Main(string[] args)
{
SortedDictionary<string, string> sortedDictionary = new SortedDictionary<string, string>();
ICollection<KeyValuePair<string, string>> treeSetOfKeyValuePairs = (ICollection<KeyValuePair<string, string>>)typeof(SortedDictionary<string, string>)
.GetField("_set",BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField)
.GetValue(sortedDictionary)
;
ICollection<string> treeSetOfString = (ICollection<string>) Activator.CreateInstance(
treeSetOfKeyValuePairs.GetType()
.GetGenericTypeDefinition()
.MakeGenericType(new Type[] { typeof(string) }), new object[] { StringComparer.CurrentCulture});
treeSetOfString.Add("XXX");
treeSetOfString.Add("BBB");
treeSetOfString.Add("AAA");
treeSetOfString.Add("ZZZ");
Console.WriteLine(treeSetOfString);
foreach (String s in treeSetOfString)
{
Console.WriteLine(s);
}
}
}
}
Ausgabe:
Code:
System.Collections.Generic.TreeSet`1[System.String]
AAA
BBB
XXX
ZZZ
Gruß Tom