1

如果我使用这些类型在 WPF 中显示数据,我在序列化通过 WCF mex 端点获取的类型时遇到问题。

这是因为自动生成的类型确实实现了 INotifyPropertyChanged 接口,并且因为 WPF 绑定订阅了它。

执行此操作的正常方法是将 [field: NonSerialized] 添加到事件声明中。我不想这样做,因为这些类是自动生成的。

我也不想切换到 DataContractSerializer,主要是因为我发现在所有其他情况下我使用的 BinaryFormatter 都相当方便。

我想做的是找到一个字段,在其中存储事件数据并将其标记为 NonSerialized 在序列化开始使用反射之前。

以下是我的问题:

  1. 是否可以在运行时添加属性?
  2. 如何找到与事件关联的字段?
4

1 回答 1

0

以下是我脑海中的一些想法。

  1. 在序列化时使用 CodeDom 或 ILGenerator 创建动态代理类(不实现 INotifyPropertyChanged)。然后使用 AutoMapper 之类的东西将您的原始对象图映射到这些代理类上。

  2. 如果您唯一真正的问题是事件订阅......并且您知道这些类是自动生成的(因此它们没有任何类型的事件特殊实现,也就是说,它们只使用普通的底层字段委托)。 ..您可以在序列化时暂时删除然后重新添加事件订阅。随机谷歌参考:如何从 EventInfo 中获取委托对象?. 基本上,您可以获取所有当前事件订阅,清除委托,然后重新添加订阅.....或者您可以将底层委托字段设为空,然后在序列化完成后重新设置它。

  3. 如果您不太关心性能,您可以使用 ISerializationSurrogate http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializationsurrogate.getobjectdata.aspx 反映您的所有 FieldInfos 对象和确保忽略委托类型的字段。

于 2012-05-06T01:25:05.067 回答