2009-09-19 18 views
37

Załóżmy, że mam wiele obiektów i mają one wiele właściwości łańcuchów.Wyliczanie za pomocą właściwości obiektu (łańcucha) w języku C#

Czy istnieje programowy sposób przejścia przez nie i wyprowadzenia nazwy właściwości i jej wartości, czy też musi być ona zakodowana?

Czy istnieje sposób LINQ do zapytania właściwości obiektu typu "ciąg" i ich wyprowadzenia?

Czy trzeba zakodować na sztywno nazwy właściwości, które chcesz odtworzyć?

Odpowiedz

70

Użyj refleksji. Nie jest to tak szybkie jak dostęp do nieruchomości, ale robi to, co chcesz.

Poniższe zapytanie generuje typ anonimowy przy nazwie i wartości właściwości dla każdej właściwości String wpisany w obiekcie „myObject”:

var stringPropertyNamesAndValues = myObject.GetType() 
    .GetProperties() 
    .Where(pi => pi.PropertyType == typeof(string) && pi.GetGetMethod() != null) 
    .Select(pi => new 
    { 
     Name = pi.Name, 
     Value = pi.GetGetMethod().Invoke(myObject, null) 
    }); 

Zastosowanie:

foreach (var pair in stringPropertyNamesAndValues) 
{ 
    Console.WriteLine("Name: {0}", pair.Name); 
    Console.WriteLine("Value: {0}", pair.Value); 
} 
+2

Zamiast pi.GetGetMethod() Invoke (myObject, null) Wolę używać pi.GetValue (myObject, null.) - prostsze do odczytania. – Sam

3

Można użyć refleksji Zrób to... . jest przyzwoity artykuł pod adresem CodeGuru, ale to może być coś więcej niż szukasz ... możesz się z niego uczyć, a następnie przyciąć do swoich potrzeb.

-2

Co powiesz na coś takiego?

public string Prop1 
{ 
    get { return dic["Prop1"]; } 
    set { dic["Prop1"] = value; } 
} 

public string Prop2 
{ 
    get { return dic["Prop2"]; } 
    set { dic["Prop2"] = value; } 
} 

private Dictionary<string, string> dic = new Dictionary<string, string>(); 
public IEnumerable<KeyValuePair<string, string>> AllProps 
{ 
    get { return dic.GetEnumerator(); } 
} 
11

Możesz uzyskać wszystkie właściwości danego typu, używając metody GetProperties. Następnie możesz filtrować tę listę przy użyciu metody LINQ Where. Na koniec możesz wyświetlać właściwości za pomocą metody LINQ Select lub wygodnego skrótu, takiego jak ToDictionary.

Jeśli chcesz ograniczyć wyliczanie do właściwości mających typu String można użyć tego kodu:

IDictionary<String, String> = myObject.GetType() 
    .GetProperties() 
    .Where(p => p.CanRead && p.PropertyType == typeof(String)) 
    .ToDictionary(p => p.Name, p => (String) p.GetValue(myObject, null)); 

Spowoduje to utworzenie słownika, który mapuje nazwy własności do wartości nieruchomości. Ponieważ typ właściwości jest ograniczony do String, bezpieczne jest rzutowanie wartości właściwości na String, a typ zwracanego typu to IDictionary<String, String>.

Jeśli zamiast tego chcesz wszystkie właściwości można zrobić to tak:

IDictionary<String, Object> = myObject.GetType() 
    .GetProperties() 
    .Where(p => p.CanRead) 
    .ToDictionary(p => p.Name, p => p.GetValue(myObject, null)); 
3

Jeśli twoim celem jest po prostu wyjście dane przechowywane we właściwościach obiektu przy użyciu formatu czytelnych dla ludzi, wolę po prostu serializacji obiekt do formatu JSON.

using System.Web.Script.Serialization; 
//... 

string output = new JavaScriptSerializer().Serialize(myObject); 
Powiązane problemy