Feedback

Reflection-Type vereinfachen

Sprache: C#

Wenn man einen Generischen Typ per reflektion abfragt dann bekommt man aus der FullName-Eigenschaft oftmals noch Versionsnummer usw. mitgeliefert. Das braucht man häufig aber nicht. Angenommen wir haben eine Eigenschaft mit folgendem Typ deklariert und kompiliert:[code]Dictionary<List<string>, Dictionary<List<int>, List<double>>>[/code] Daraus wird dann: [code]System.Collections.Generic.Dictionary`2[[System.Collections.Generic.List`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Collections.Generic.Dictionary`2[[System.Collections.Generic.List`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Collections.Generic.List`1[[System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]][/code] Das folgende Snippet erzeugt Namen die in etwa folgendermaßen aussehen:[code]System.Collections.Generic.Dictionary`2[System.Collections.Generic.List`1[System.String],System.Collections.Generic.Dictionary`2[System.Collections.Generic.List`1[System.Int32],System.Collections.Generic.List`1[System.Double]]][/code] Diese können nach wie vor über CodeDomProvider in bspws. C# Code konvertiert werden.
        private string GetSimpleTypeString(Type t)
        {
            Type[] ts = t.GetGenericArguments();
            StringBuilder sb = new StringBuilder();
            sb.Append(t.FullName.Split('`').First());
            if (ts.Length > 0)
            {
                sb.Append("`");
                sb.Append(ts.Length);
                sb.Append("[");
                for (int i = 0; i < ts.Length; ++i)
                {
                    sb.Append(GetSimpleTypeString(ts[i]));
                    if (i < ts.Length - 1)
                        sb.Append(",");
                }
                sb.Append("]");
            }
            return sb.ToString();
        }
        private string GetSimpleTypeString(Type t)
        {
            Type[] ts = t.GetGenericArguments();
            StringBuilder sb = new StringBuilder();
            sb.Append(t.FullName.Split('`').First());
            if (ts.Length > 0)
            {
                sb.Append("`");
                sb.Append(ts.Length);
                sb.Append("[");
                for (int i = 0; i < ts.Length; ++i)
                {
                    sb.Append(GetSimpleTypeString(ts[i]));
                    if (i < ts.Length - 1)
                        sb.Append(",");
                }
                sb.Append("]");
            }
            return sb.ToString();
        }