オブジェクトを手動でシリアル化する方法について先週この質問をしましたが、それ以来、私の問題を解決する汎用ラッパーを作成しようとしています。(私はサードパーティのコードの間で立ち往生しているので、このようにしています。) イベントを除いて、ほとんどすべてが機能しています。
逆シリアル化するときにオブジェクトの新しいインスタンスを技術的に作成しているため、イベント サブスクリプションは保持されなくなりました。サブスクリプションをコピーする方法、または逆シリアル化されたバージョンのすべてのイベントを元のバージョンに転送する方法はありますか?
ここに私が現在使用しているものに似たものがあります:
[Serializable]
public class Wrapper<T> : ISerializable
{
public T Wrappee { get; set; }
public Wrapper(T wrappee)
{
Wrappee = wrappee;
}
protected Wrapper(SerializationInfo info, StreamingContext context)
{
Wrappee = (T)FormatterServices.GetUninitializedObject(typeof(T));
FieldInfo[] fields = typeof(T).GetFields();
foreach (FieldInfo fieldInfo in fields)
{
var value = info.GetValue(fieldInfo.Name, fieldInfo.FieldType);
fieldInfo.SetValue(Wrappee, value);
}
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
FieldInfo[] fields = typeof(T).GetFields();
foreach (FieldInfo fieldInfo in fields)
{
var value = fieldInfo.GetValue(Wrappee);
info.AddValue(fieldInfo.Name, value);
}
}
}
まあ、それはそれの一般的な考えです。基本的に、フィールドで行ったのと同様の方法でイベントを行う方法があるかどうか疑問に思っていました。同じ方法で EventInfo を取得できることはわかっていますが、これがサブスクリプションの修正にどのように変換されるかはわかりません。
どんな助けでも大歓迎です。
編集 私はまだこれを行う方法を見つけようとしていますが、この質問に出くわしました。私はこのようなことをして、その側でサブスクリプションを修正することなく、イベントを元の appdomain に転送することができますか?