13

我正在用 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我的构造函数的参数在哪里。在 WinRTGetProperties()中不存在。Intellisense forthis.GetType().没有显示任何我可以使用的有用信息。

4

2 回答 2

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));
}
于 2012-11-02T15:00:35.907 回答
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它的作用相同,但它是一种内置方法。

于 2012-11-11T21:48:56.470 回答