Nota: Esto no se refiere directamente a su pregunta
es el comportamiento esperado esta inversión?
pero lo siento agrega a él.
Puede utilizar GenerateCodeFromExpression
para devolver una cadena que podría ser utilizado para generar el código para generar el tipo para que, por ejemplo, utilizando el código (modificado de this SO answer por 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;
}
Al dejar codeDomProvider
manejar la representación de cadena, puede estar seguro que lo que se generará coincidirá con la forma en que defina el Tipo.
Los resultados con 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;
Los resultados con FriendlyName
// returns "string[,][,,][,,,]"
typeof(string[,][, ,][, , ,]).FriendlyName();
// returns "string[,,,][,,][,]"
typeof(string[, , ,][, ,][,]).FriendlyName();
// returns "System.Collections.Generic.List<int>"
typeof(List<int>).FriendlyName();
me he encontrado esto antes; parece que mientras en C# declaras índices/dimensiones de matriz en el orden en el que lees, reflection devuelve un nombre de tipo que coincide con su estructura lógica. Y un (C#) 'string [,] [,,] [,,,]' es, después de todo, un valor de tipo 'string', de lo cual un array de 4 dimensiones (es decir' string [,,,] ') , de eso una matriz tridimensional (es decir 'cadena [,,,] [,,]') y de la misma una matriz bidimensional (es decir 'cadena [,,,] [,,] [,]'). –
Todo lo que dijo ^^^^. La sintaxis de C# ([explicada en profundidad aquí] (http://blogs.msdn.com/b/ericlippert/archive/2009/08/17/arrays-of-arrays.aspx)) no es necesaria para coincidir con el nombre de reflexión convención. Entonces, si está tratando con la reflexión: use la denominación de reflexión. En otras noticias, los tipos anidados no son 'Outer.Inner' sino' Outer + Inner' en su lugar, y los genéricos no son 'Foo <,,>' sino 'Foo \' 3' en su lugar. –
Estoy generando código basado en algunos tipos de entrada, así que definitivamente necesitaré revertir la información sobre los índices/dimensiones proporcionados a través de la instancia de System.Type. –