Tendría que usar la reflexión, básicamente. No debería ser demasiado difícil a través de Type.GetProperties
, pero no sé de nada "incorporado".
Como señaló Leppie, el que ordena no es simple - tendría que examinar el orden de los parámetros, que al menos le daría el orden de todos los tipos de las propiedades. Si solo tienes diferentes tipos, estaría bien.
Si no se preocupan por el ordenamiento, puede utilizar:
var array = t.GetType()
.GetProperties()
.Select(p => p.GetValue(t, null))
.ToArray();
EDIT: Acabo de ocurrir algo que en realidad lo arreglará, pero es específico de la implementación. El compilador de C# genera tipos anónimos usando tipos genéricos. Así new { A = 5, B = "foo" }
genera realmente un tipo anónimo de esta manera:
class <>_Anon<TA, TB>
{
internal <>_Anon(TA a, TB b)
}
para que pueda resolver los nombres de propiedad en orden basado en los tipos genéricos de las propiedades genéricas, a continuación, ir a buscar las propiedades con el fin del tipo inmediato. Pero es fea ...
using System;
using System.Linq;
using System.Reflection;
class Test
{
// Note: this uses implementation details of anonymous
// types, and is basically horrible.
static object[] ConvertAnonymousType(object value)
{
// TODO: Validation that it's really an anonymous type
Type type = value.GetType();
var genericType = type.GetGenericTypeDefinition();
var parameterTypes = genericType.GetConstructors()[0]
.GetParameters()
.Select(p => p.ParameterType)
.ToList();
var propertyNames = genericType.GetProperties()
.OrderBy(p => parameterTypes.IndexOf(p.PropertyType))
.Select(p => p.Name);
return propertyNames.Select(name => type.GetProperty(name)
.GetValue(value, null))
.ToArray();
}
static void Main()
{
var value = new { A = "a", Z = 10, C = "c" };
var array = ConvertAnonymousType(value);
foreach (var item in array)
{
Console.WriteLine(item); // "a", 10, "c"
}
}
}
Los campos no tienen un orden implícito, ¿cómo funcionará? – leppie
Quizás deba usar un tipo con nombre en este caso. – Indy9000
No es así. Hay una diferencia entre un 'Tipo' que tiene miembros y una matriz. Es como decir: ¿Cómo tomo un 'System.Windows.Forms.Form' y convierto todos sus miembros en un' object [] '. Eso no quiere decir que no sea factible, es decir que no es una analogía apropiada. – CodingGorilla