我尝试过
public string GetContentProperty(Type type)
{
var contentPropertyAttribute = type.GetTypeInfo().GetCustomAttribute<ContentPropertyAttribute>();
return contentPropertyAttribute?.Name;
}
但它总是返回 null。
在 WPF 中它工作正常。
最佳答案
我研究这个问题的时间比我真正应该研究的时间要长,但仍然不知道完整的答案。我真诚地希望其他人能够出现并提供更好的选择。
到目前为止,我发现在 UWP 上,对 GetCustomAttributes()
的调用会返回一个空枚举。起初,我认为这可能与对 UWP 程序集进行的类型剥离有关,但我可以在调试版本中重现该问题,而无需“使用 .NET Native 工具链编译”选项启用,因此编译的程序集应包含完整的类型信息。即使我修改 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
,以便可以返回它,这一切都非常困惑而且并不理想。
但它确实有效。所以,就是这样。 :)
关于c# - 如何获取UWP中Content属性的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40049601/