Dovresti usare la riflessione, in pratica. Non dovrebbe essere troppo difficile tramite Type.GetProperties
, ma non so nulla di "built-in".
Come sottolineato da Leppie, l'ordinamento non è semplice: è necessario esaminare l'ordine dei parametri, che fornirebbe almeno l'ordine di tutti i tipi di proprietà. Se tu avessi solo tipi diversi, quello andrebbe bene.
Se non si preoccupano l'ordinamento, è possibile utilizzare:
var array = t.GetType()
.GetProperties()
.Select(p => p.GetValue(t, null))
.ToArray();
EDIT: Ho solo pensato di qualcosa che effettivamente risolvere il problema, ma è specifica implementazione. Il compilatore C# genera tipi anonimi usando tipi generici. Così new { A = 5, B = "foo" }
sarà effettivamente creare un tipo anonimo come questo:
class <>_Anon<TA, TB>
{
internal <>_Anon(TA a, TB b)
}
modo da poter lavorare fuori i nomi di proprietà, al fine in base ai tipi generici di proprietà generici, quindi recuperare le proprietà in ordine dal tipo concreto. Ma è brutto ...
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"
}
}
}
fonte
2012-06-26 17:10:05
I campi non hanno ordine implicito, quindi come funzionerà? – leppie
Forse dovresti usare un tipo chiamato in questo caso. – Indy9000
Non lo fai. C'è una differenza tra un 'Tipo' che ha membri e un array. È come dire: come faccio a prendere un 'System.Windows.Forms.Form' e convertire tutti i suoi membri in un' oggetto [] '. Questo non vuol dire che non sia fattibile, vuol dire che non è un'analogia corretta. – CodingGorilla