2011-06-22 21 views

Odpowiedz

39

Można użyć refleksji.

// 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(); 
} 

Jednak to nadal nie rozwiązuje problemu, w którym obiekt ma 1000 właściwości.

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); 
} 

Źródło: http://www.csharp-examples.net/reflection-property-names/

+14

Bogowie Linq teraz płaczą ... – Blindy

16

Innym rozwiązaniem, z którego możesz skorzystać w tej sytuacji, jest przekonwertowanie obiektu na obiekt JSON. Biblioteka JSON.NET ułatwia to i prawie każdy obiekt może być reprezentowany w JSON. Następnie możesz przeglądać właściwości obiektów jako pary Nazwa/Wartość. Takie podejście byłoby przydatne w przypadku obiektów złożonych, które zawierają inne obiekty, ponieważ można je przeglądać w sposób przypominający drzewa.

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

To fantastyczne i proste rozwiązanie. Zajmuje się wszystkimi obiektami podrzędnymi automatycznie, nie martwiąc się o rekurencję lub przechwytywanie wszystkich właściwości. – mppowe

1

lepsza wersja do głębokich rekwizytów wyszukiwania również w 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)); 
} 
Powiązane problemy