Uwaga: to nie bezpośrednio zająć swoje pytanie
Czy to odwrócenie oczekiwane zachowanie?
ale czuję, że dodaje do niego.
Można użyć GenerateCodeFromExpression
zwraca ciąg znaków, który może być używany do generowania kodu w celu wygenerowania typ dla ciebie, na przykład za pomocą tego kodu (modyfikowany this SO answer przez hvd):
/// <summary>
/// <para>Returns a readable name for this type.</para>
/// <para>e.g. for type = typeof(IEnumerable<IComparable<int>>),</para>
/// <para>type.FriendlyName() returns System.Collections.Generic.IEnumerable<System.IComparable<int>></para>
/// <para>type.Name returns IEnumerable`1</para>
/// <para>type.FullName() returns System.Collections.Generic.IEnumerable`1[[System.IComparable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]</para>
/// </summary>
public static string FriendlyName(this Type type)
{
string result;
using (var codeDomProvider = CodeDomProvider.CreateProvider("C#"))
{
var typeReferenceExpression = new CodeTypeReferenceExpression(new CodeTypeReference(type));
using (var writer = new StringWriter())
{
codeDomProvider.GenerateCodeFromExpression(typeReferenceExpression, writer, new CodeGeneratorOptions());
result = writer.GetStringBuilder().ToString();
}
}
return result;
}
Dzięki temu, że codeDomProvider
obsługuje reprezentację ciągów, , możesz być pewny, że to, co zostanie wygenerowane, będzie zgodne z definicją typu.
Wyniki z FullName
:
// returns "System.String[,,,][,,][,]"
typeof(string[,][, ,][, , ,]).FullName;
// returns "System.String[,][,,][,,,]"
typeof(string[, , ,][, ,][,]).FullName;
// returns "System.Collections.Generic.List`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"
typeof(List<int>).FullName;
Wyniki z FriendlyName
// returns "string[,][,,][,,,]"
typeof(string[,][, ,][, , ,]).FriendlyName();
// returns "string[,,,][,,][,]"
typeof(string[, , ,][, ,][,]).FriendlyName();
// returns "System.Collections.Generic.List<int>"
typeof(List<int>).FriendlyName();
natknąłem to wcześniej; wydaje się, że podczas gdy w C# deklarujesz indeksy/wymiary tablicy w kolejności, w której czytasz, odbicie zwraca nazwę typu, która pasuje do jej logicznej struktury. A (C#) 'string [,] [,,] [,,,,]' jest przecież wartością typu 'string', którego jest czterowymiarową tablicą (np.' String [,,,] ') , z tego 3-wymiarowa tablica (tj. "ciąg [,,,] [,,]") i tym samym dwuwymiarowa tablica (tj. "ciąg [,,,] [,,] [,]'). –
Wszystko, co powiedział ^^^^. Składnia C# ([wyjaśniono szczegółowo w tym miejscu] (http://blogs.msdn.com/b/ericlippert/archive/2009/08/17/arrays-of-arrays.aspx)) nie jest wymagana, aby dopasować się do nazwy odbicia Konwencja. Więc jeśli masz do czynienia z refleksją: użyj nazwy refleksji. W innych wiadomościach typy zagnieżdżone to nie "Outer.Inner", ale "Outer + Inner" zamiast, a generics to nie 'Foo <,,>', ale 'Foo \' 3' zamiast tego. –
Generuję kod na podstawie niektórych typów danych wejściowych, więc zdecydowanie będę musiał odwrócić informacje o indeksach/wymiarach dostarczanych przez instancję System.Type. –