首页 > 解决方案 > .NET Remoting 序列化基于 lambda 表达式的委托

问题描述

我想订阅一个MarshalByRefObject存在于单独进程中的事件。我试过了:

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

这会引发异常,因为 lambda 不可序列化:

System.Runtime.Serialization.SerializationException: 'Type '...+<>c__DisplayClass3_0' in Assembly '...' 未标记为可序列化。

显然,我无法标记此编译器生成的类型[Serializable]。如何使用 Remoting 订阅事件?

标签: .netremoting

解决方案


正如@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在调用过程中可以做任何你想做的事情。


推荐阅读