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();
}
Alte URL:
/snippet/reflection-type-vereinfachen/1698