2012-11-02 10 views
13

Piszę aplikację Windows 8 w języku C# i XAML. Mam klasę z wieloma właściwościami tego samego typu, które są ustawione w konstruktorze w ten sam sposób. Zamiast pisania i przypisywania każdej własności ręcznie chcę uzyskać listę wszystkich właściwości pewnego typu na mojej klasie i ustawić je wszystkie na foreach.Jak uzyskać właściwości klasy w WinRT

W „normalnej” NET chciałbym napisać to

var properties = this.GetType().GetProperties(); 
foreach (var property in properties) 
{ 
    if (property.PropertyType == typeof(Tuple<string,string>)) 
    property.SetValue(this, j.GetTuple(property.Name)); 
} 

gdzie j jest parametrem mojego konstruktora. W WinRT nie istnieje GetProperties(). Intellisense dla this.GetType(). nie pokazuje niczego użytecznego, czego mógłbym użyć.

+2

http://msdn.microsoft.com/en-us/library/windows/apps/br230302.aspx#reflection –

Odpowiedz

16

Trzeba użyć GetRuntimeProperties zamiast GetProperties:

var properties = this.GetType().GetRuntimeProperties(); 
// or, if you want only the properties declared in this class: 
// var properties = this.GetType().GetTypeInfo().DeclaredProperties; 
foreach (var property in properties) 
{ 
    if (property.PropertyType == typeof(Tuple<string,string>)) 
    property.SetValue(this, j.GetTuple(property.Name)); 
} 
+2

Błąd: "Typ systemu" nie zawiera definicji "GetTypeInfo" –

+3

Jest to metoda rozszerzenia , musisz zaimportować przestrzeń nazw 'System.Reflection' –

+0

Po zaimportowaniu' System.Reflection', otrzymuję "System.Reflection.TypeInfo" nie zawiera definicji "GetProperties". Czy potrzebny jest inny import? –

6

Spróbuj tego:

public static IEnumerable<PropertyInfo> GetAllProperties(this TypeInfo type) 
{ 
    var list = type.DeclaredProperties.ToList(); 

    var subtype = type.BaseType; 
    if (subtype != null) 
     list.AddRange(subtype.GetTypeInfo().GetAllProperties()); 

    return list.ToArray(); 
} 

i używać go tak:

var props = obj.GetType().GetTypeInfo().GetAllProperties(); 

Aktualizacja: Użyj tego rozszerzenia metoda tylko jeśli GetRuntimeProperties jest niedostępne, ponieważ GetRuntimeProperties robi to samo, ale jest metodą wbudowaną.

+0

Mam nadzieję, że ta funkcja mogłaby zostać dodana do samej klasy TypeInfo. – hardywang

Powiązane problemy