Instanzen von mit internal markierten (generischen) Typen erstellen

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...

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
 
Zurück