如何在UWP中获取内容属性的名称?

时间:2016-10-14 18:13:01

标签: c# .net reflection uwp

我已经尝试了

public string GetContentProperty(Type type)
{
     var contentPropertyAttribute = type.GetTypeInfo().GetCustomAttribute<ContentPropertyAttribute>();
     return contentPropertyAttribute?.Name;
}

但它总是返回null。

在WPF中,它可以正常工作。

1 个答案:

答案 0 :(得分:1)

我一直在看这个问题的时间超过了我应该拥有的时间,但仍然不知道完整的答案。我真诚地希望有其他人参与并提供更好的选择。

到目前为止,我发现在UWP上,对GetCustomAttributes()的调用返回空枚举。起初我认为这可能与UWP程序集的类型剥离有关,但我可以在Debug构建中重现该问题,而不需要&#34;使用.NET Native工具链编译&#34; 选项已启用,因此编译的程序集应包含完整的类型信息。即使我修改Default.rd.xml文件以包含<Type Name="Windows.UI.Xaml.Markup.ContentPropertyAttribute" Dynamic="Required All"/>(理论上可能省略了ContentPropertyAttribute类型),这也无济于事。

所以,我对于究竟发生了什么感到茫然。但是,与此同时,以下是您的方法的一个版本:

static string GetContentProperty<TSource>()
{
    return typeof(TSource).GetTypeInfo().CustomAttributes
        .Where(a => a.AttributeType == typeof(ContentPropertyAttribute))
        .FirstOrDefault()?.NamedArguments.Cast<CustomAttributeNamedArgument?>()
        .Where(n => n.Value.MemberName == "Name")
        .FirstOrDefault()?.TypedValue.Value.ToString();
}

(而不是传递Type对象,我只是将其设为通用,让方法完成查找类型的工作。)

在上面,我将CustomAttributeNamedArgument值类型转换为可空类型,因此我可以使用FirstOrDefault(),我觉得比实现枚举更方便,检查它的长度,然后如果第一个元素非空,则检索它。

即使在GetCustomAttributes()方法仍然不能使我认为这与某些某种程度上与编译的UWP程序集有关,它会丢弃类型信息这一事实。但不幸的是,我对UWP的具体领域知之甚少。

我是第一个同意上述不是一个非常好的选择的人。必须获取属性的声明信息而不是属性本身,然后在该数据中搜索属性名称,最后必须将数据中的无类型值属性强制转换回string,以便返回,这一切都非常混乱而且不理想。

但确实有效。那么,就是这样。 :)