繁体   English   中英

可以设置未在目标类型上定义的MetaType回调吗?

[英]Possible to set MetaType callbacks not defined on target type?

我正在将代码库的一部分从通过预编译器和属性标记使用protobuf-net移至将类型及其子类型和字段手动添加到RuntimeTypeModel.Default。

目的是使Protobuf-net详细信息与数据类脱节,并获得一些易于版本化的概述,以便进行某些版本化的自动更新。

到现在为止还挺好。 我遇到了一些障碍,我将用力猛击一下,以解决它们,但是一堵砖墙似乎确实顽固地阻碍了进步:

我似乎无法将我的MetaType的OnDeserialized和类似的回调绑定到目标类型上未定义的任何内容。

最初,我很惊讶地发现拥有这些回调的MethodInfo变量而不是简单的委托或事件,但是我发现,将注册调用的字符串变体与目标类型的扩展方法结合起来可以解决问题。 不幸的是,事实并非如此。

请注意,数据类和序列化代码存在于单独的程序集中,因此,不幸的是,我也无法通过部分类来更好地解决此问题。

我是否遗漏了某些东西,或者根本无法为类型的序列化(在该类型以外的其他地方定义)注册回调?

供参考,我目前正在使用protobuf-net r668。

编辑:无法进一步延迟,我选择了在ProtoBuf序列化回调周围手动运行这些事件。 仍然好奇是否可以这样做。

目前尚不可能。 预期回调将是所使用类型的实例方法。 但是请注意,代码的其他一些部分允许static方法将实例作为参数接受,因此从理论上讲 ,可以更改代码以允许将类似以下内容用作回调:

public static class Bar
{
    public static void Run(Foo foo)
    {
        Console.WriteLine("Got here");
    }
}

但是,这目前尚不可能,并且可能导致混乱-尤其是在可访问性方面。 IL代码有一些技巧,意味着可以将非公共方法用作回调,但是要做到这一点,需要声明IL与DTO类型相关。 它不能通过假装上下文也是回调类型来欺骗可访问性,而不会引入更多复杂性。

所以:

  • 不是现在
  • 理论上可能的...
  • ...但是我不确定这样做的实用性(这将有多大用处等)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM