基本的にはリフレクションを使用する必要があります。経由でそれほど難しいことではないはずType.GetProperties
ですが、「組み込み」については何も知りません。
leppieが指摘したように、順序付けは単純ではありません。パラメーターの順序を調べる必要があります。これにより、少なくともすべてのタイプのプロパティの順序がわかります。異なるタイプしかない場合は、それで問題ありません。
順序を気にしない場合は、次を使用できます。
var array = t.GetType()
.GetProperties()
.Select(p => p.GetValue(t, null))
.ToArray();
編集:私は実際にそれを修正する何かを考えましたが、それは実装固有です。C#コンパイラは、ジェネリック型を使用して匿名型を生成します。したがってnew { A = 5, B = "foo" }
、実際には次のような匿名タイプを作成します。
class <>_Anon<TA, TB>
{
internal <>_Anon(TA a, TB b)
}
したがって、ジェネリックプロパティのジェネリックタイプに基づいてプロパティ名を順番に計算してから、具象タイプから順番にプロパティをフェッチできます。しかし、それは醜いです...
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"
}
}
}