簡體   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