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

Possible to set MetaType callbacks not defined on target type?

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

目的是从数据中分离 protobuf-net 细节 类 并为某些版本自动更新获得一些容易概览的可操作性。

到目前为止,还不错。我遇到了一些障碍,我会 bash 我的头再多一点,以确保它们得到解决,但是一堵砖墙似乎确实顽固地阻碍了进展:

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

最初我很惊讶地发现 MethodInfo 变量持有这些回调而不是简单的委托或事件,但我认为将注册调用的字符串变体与目标类型的扩展方法结合起来就可以了。不幸的是,情况似乎并非如此。

请注意,数据 类 和序列化代码存在于不同的程序集中,因此不幸的是,我也无法通过部分 类 不太巧妙地解决这个问题。

我是不是遗漏了什么,或者根本不可能为某个类型的序列化注册回调,在该类型以外的地方定义?

作为参考,我目前使用的是protobuf-net r668。

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

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

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

但是,现在 不可能,并且可能会导致混淆 - 特别是在可访问性方面。 IL 代码使用了一些技巧来表示非 public 方法可以用作回调,但要做到这一点需要将 IL 声明为与 DTO 类型相关;它不能通过假装上下文也是回调类型而不引入更多复杂性来欺骗可访问性。

所以:

  • 目前没有
  • 理论上可能...
  • ...但我不确定这样做的效用(这会有多大用处等)