基本上,您必须使用反射。通过 应该不会太难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"
}
}
}