c# - 如何获取UWP中Content属性的名称?

标签 c# .net reflection uwp

我尝试过

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/

相关文章:

c# - dotnet run 给了我 "*** stack smashing detected ***: <unknown> terminated"

c# - 您可以在一个 Windows Azure 实例上部署多个 Web 应用程序吗?

c# - 我的 WPF 应用程序未触发 MainWindow_Loaded

c# - 如何制作仅在系统托盘中运行的 .NET Windows 窗体应用程序?

c# - 无法捕获 Winforms 中未处理的异常

c# - 如何获取枚举的自定义属性值?

c# - XNA:未调用基本 DrawableGameComponent 覆盖函数(更新、绘制等)

c# - 找不到 WebClient

reflection - Scala:如何动态实例化对象并使用反射调用方法?

c# - 只能在 Type.IsGenericParameter 为 true 的类型上调用方法