如何在WinRT中获取类的属性

时间:2012-11-02 14:57:39

标签: c# reflection microsoft-metro windows-runtime

我正在用C#和XAML编写Windows 8应用程序。我有一个类,它具有许多相同类型的属性,它们在构造函数中以相同的方式设置。而不是手动编写和分配每个属性我想获得我的类中的某些类型的所有属性的列表,并将它们全部设置为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()不存在。 this.GetType().的智能感知并未显示我可以使用的任何有用信息。

2 个答案:

答案 0 :(得分:16)

您需要使用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));
}

答案 1 :(得分:6)

试试这个:

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执行相同但是内置方法。