Подтвердить что ты не робот

Как получить свойства класса в WinRT

Я пишу приложение Windows 8 в С# и XAML. У меня есть класс со многими свойствами того же типа, которые установлены в конструкторе одинаково. Вместо того, чтобы писать и назначать для каждого из свойств вручную, я хочу получить список всех свойств определенного типа в моем классе и установить их все в foreach.

В "нормальном".NET я бы написал это

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

где j - параметр моего конструктора. В WinRT GetProperties() не существует. Intellisense для this.GetType(). не показывает ничего полезного, которое я мог бы использовать.

4b9b3361

Ответ 1

Вам нужно использовать GetRuntimeProperties вместо 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

Попробуйте следующее:

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

и используйте его следующим образом:

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

Обновление: Используйте этот метод расширения, только если GetRuntimeProperties недоступен, потому что GetRuntimeProperties делает то же самое, но является встроенным методом.