在UWP应用中为泛型类型添加运行时指令

本文关键字:添加 运行时 指令 泛型类型 UWP 应用 | 更新日期: 2023-09-27 18:06:04

我们遇到了一个与序列化相关的自定义泛型抛出异常的严重问题。下面是一个示例类:

internal class Foo<T> : IFoo<T>
{
    public void Bar(T tralalala)
    {
        //do whatever
    }
}

现在,我们使用Prism框架及其内置的SessionStateService来保存应用程序关闭或挂起时的状态。问题是,当Prism试图在重新启动后恢复应用状态时,会抛出一个异常:

System.Runtime.Serialization.InvalidDataContractException
SerializationCodeIsMissingForType, Utilities.Foo.Foo`1[T]

我很清楚,为了使序列化器/反序列化器工作,. net本机编译器需要为该类型提供额外的元数据,如rd.xml文件中所标记的那样。问题是,我不知道如何标记这种类型。我认为整个命名空间的通用标签会起作用:

 <Namespace Name="Utilities.Foo" Dynamic="Required All" DataContractSerializer="Required All" />

但事实并非如此,我真的找不到任何如何正确标记泛型类型的例子。由于序列化/反序列化问题使得不可能通过WACK测试,因此我们确实需要解决这个问题。帮帮我,Stack Overflow,你是我唯一的希望。

在UWP应用中为泛型类型添加运行时指令

您可以使用<TypeInstantiation>元素为构造的泛型类型设置反射策略。详见https://msdn.microsoft.com/en-us/library/dn627487(v=vs.110).aspx

例如,下面是Foo的rd.xml文件

<?xml version="1.0" encoding="utf-8" ?>
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
  <Application>
    <Assembly Name="*Application*" Dynamic="Required All" />
    <TypeInstantiation Name="Foo"
                        Arguments="System.Int32"
                        DataContractSerializer="Required All" />
    <TypeInstantiation Name="Foo"
                        Arguments="System.String"
                        DataContractSerializer="Required All" />
  </Application>
</Directives>

我的测试应用程序测试了Foo<int>Foo<string>,所以我有两个TypeInstantiation条目,具有不同的Arguments属性值,如上所示。

或者您可以使用下面的元素将策略应用于所有Foo<T>类型,

<TypeInstantiation Name="Foo" DataContractSerializer="Required All" />

注意元素没有Arguments属性