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

本文关键字:属性 获取 UWP | 更新日期: 2023-09-27 18:13:03

我试过了

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

但是它总是返回null

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

我看这个问题的时间比我真正应该看的时间长,但仍然不知道完整的答案。我真诚地希望有人能提供一个更好的选择。

到目前为止,我发现在UWP上,对GetCustomAttributes()的调用返回一个空枚举。起初我认为这可能与UWP程序集的类型剥离有关,但我可以在调试构建中重现这个问题,没有"使用。net本机工具链编译"选项启用,因此编译的程序集应该包括完整的类型信息。即使我修改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,以便返回它,这一切都非常混乱,而且不理想。

但它确实有效。就是这样。:)