.NET远程处理序列化基于lambda表达式的委托



我想订阅位于单独进程中的MarshalByRefObject上的事件。我试过了:

remoteObject.Progress += (sender, args) => { };

这引发了一个异常,因为lambda不可序列化:

System.Runtime.Serialization.Serialization异常:"Type"+<>程序集"…"中的c__DisplayClass3_0'未标记为可序列化。'

很明显,我无法将此编译器生成的类型标记为[Serializable]。如何使用远程处理订阅事件?

正如@Alejandro在评论中建议的那样,一个可能的解决方法是创建一个类。我构建了这个解决方案:

class DelegateAdapter<T> : MarshalByRefObject
{
Action<T> localHandler;
public DelegateAdapter(Action<T> localHandler)
{
this.localHandler = localHandler;
}
public void RemoteHandler(T value) => localHandler(value);
}

它可以这样使用:

[Serializable]
delegate void MyCustomDelegate(SomeType arg);
MyCustomDelegate dlg = new DelegateAdapter<SomeType>(arg => { ... }).RemoteHandler;

委托是可序列化的。它的目标是调用过程中的MarshalByRefObject,它可以做任何您想做的事情。