2011-06-22 37 views
26

tôi có đối tượng như thế này:C# nhận được TẤT CẢ các thuộc tính của một đối tượng

some_object 

đối tượng này có như 1000 tài sản.

tôi muốn lặp qua mỗi tài sản như thế này:

foreach (property in some_object) 
//output the property 

là có một cách dễ dàng để làm được điều này?

+1

Bạn đã kiểm tra những câu trả lời: http://stackoverflow.com/questions/737151/how-to-get-the-list- of-properties-of-class – Guildencrantz

Trả lời

39

Bạn có thể sử dụng phản ánh.

// Get property array 
var properties = GetProperties(some_object); 

foreach (var p in properties) 
{ 
    string name = p.Name; 
    var value = p.GetValue(some_object, null); 
} 

private static PropertyInfo[] GetProperties(object obj) 
{ 
    return obj.GetType().GetProperties(); 
} 

Tuy nhiên, điều này vẫn không giải quyết được vấn đề nơi bạn có đối tượng với 1000 thuộc tính.

6
using System.Reflection; // reflection namespace 

// get all public static properties of MyClass type 
PropertyInfo[] propertyInfos; 
propertyInfos = typeof(MyClass).GetProperties(BindingFlags.Public | 
               BindingFlags.Static); 
// sort properties by name 
Array.Sort(propertyInfos, 
     delegate(PropertyInfo propertyInfo1, PropertyInfo propertyInfo2) 
     { return propertyInfo1.Name.CompareTo(propertyInfo2.Name); }); 

// write property names 
foreach (PropertyInfo propertyInfo in propertyInfos) 
{ 
    Console.WriteLine(propertyInfo.Name); 
} 

Nguồn: http://www.csharp-examples.net/reflection-property-names/

+14

Các vị thần Linq đang khóc ngay bây giờ ... – Blindy

16

Một cách tiếp cận khác mà bạn có thể sử dụng trong trường hợp này là chuyển đổi đối tượng thành đối tượng JSON. Thư viện JSON.NET làm cho đối tượng dễ dàng và gần như bất kỳ có thể được biểu diễn bằng JSON. Sau đó bạn có thể lặp qua các thuộc tính đối tượng như các cặp Tên/Giá trị. Cách tiếp cận này sẽ hữu ích cho các đối tượng hỗn hợp có chứa các đối tượng khác khi bạn có thể lặp qua chúng trong một bản chất giống cây. phiên bản

MyClass some_object = new MyClass() { PropA = "A", PropB = "B", PropC = "C" }; 
JObject json = JObject.FromObject(some_object); 
foreach (JProperty property in json.Properties()) 
    Console.WriteLine(property.Name + " - " + property.Value); 

Console.ReadLine(); 
+0

Đây là một giải pháp tuyệt vời và đơn giản. Tự động chăm sóc tất cả các đối tượng phụ mà không phải lo lắng về việc đệ quy hoặc tự lấy tất cả các thuộc tính. – mppowe

1

tốt hơn cho đạo cụ tìm kiếm sâu cũng trong basetypes

public static IEnumerable<PropertyInfo> GetAllProperties(Type t) 
{ 
    if (t == null) 
    return Enumerable.Empty<PropertyInfo>(); 

    BindingFlags flags = BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly; 
    return t.GetProperties(flags).Union(GetAllProperties(t.BaseType)); 
} 
Các vấn đề liên quan