Bạn sẽ phải sử dụng phản chiếu, về cơ bản. Nó không quá khó qua Type.GetProperties
, nhưng tôi không biết gì về "tích hợp".
Như leppie chỉ ra, đặt hàng không đơn giản - bạn phải kiểm tra thứ tự các tham số, ít nhất sẽ cung cấp cho bạn thứ tự của tất cả các loại thuộc tính. Nếu bạn chỉ có các loại khác nhau, điều đó sẽ ổn thôi.
Nếu bạn không quan tâm đến thứ tự, bạn có thể sử dụng:
var array = t.GetType()
.GetProperties()
.Select(p => p.GetValue(t, null))
.ToArray();
EDIT: Tôi vừa mới nghĩ đến một cái gì đó thực sự sẽ sửa chữa nó, nhưng đó là thực hiện cụ thể. Trình biên dịch C# tạo ra các kiểu ẩn danh bằng cách sử dụng các kiểu generic. Vì vậy new { A = 5, B = "foo" }
sẽ thực sự tạo ra một loại vô danh như thế này:
class <>_Anon<TA, TB>
{
internal <>_Anon(TA a, TB b)
}
để bạn có thể làm việc ra các tên thuộc tính theo thứ tự dựa trên các loại chung của các thuộc tính chung chung, sau đó lấy các thuộc tính theo thứ tự từ loại bê tông. Nhưng đó là xấu xí ...
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"
}
}
}
Nguồn
2012-06-26 17:10:05
Các trường không có thứ tự ngầm, vì vậy cách thức hoạt động của nó? – leppie
Có lẽ bạn nên sử dụng một loại có tên trong trường hợp này. – Indy9000
Bạn không. Có sự khác biệt giữa một 'Loại' có các thành viên và một mảng. Điều đó giống như nói: Làm thế nào để lấy một 'System.Windows.Forms.Form' và chuyển đổi tất cả thành viên của nó thành một' object [] '. Đó không phải là để nói rằng nó không thể làm được, đó là để nói nó không phải là một tương tự thích hợp. – CodingGorilla