小编Waf*_*Top的帖子

比较代表行动<T>

随意质疑我的理智.

我需要确定Action<T>vs Action<T>是否是原始实例.我有一个带有类变量的类,protected Action<T> MessageCallback = null;当我abstract class Message<T>通过抽象方法创建时,我强制"他们"初始化MessageCallBack.此MessageCallback被添加到IList<Action<object>>.此列表中定义的每个操作可以不同.现在,我想要做的是从列表中删除一个特定的操作,但我没有尝试比较它.

以下是我尝试过的最后一次设置的示例:

public void Unsubscribe<TMessage>(Action<TMessage> messageCallback)
    {
        var messageType = typeof(TMessage);

        var callbackTypes = messageReceivedCallbacks
            .Keys
            .Where(k => k.IsAssignableFrom(messageType));

        lock (messageReceivedCallbacks)
        {
            foreach (var callbackType in callbackTypes)
            {
                messageReceivedCallbacks[callbackType].Remove(new Action<object>(m => 
                    messageCallback((TMessage)m)));
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我明白我想要做的事情可能是不可能的,但一般来说,我只是做一些不正当的事情或缺乏适当的知识来做这件事,就像我想的那样.提前感谢您提供的任何帮助.

      • 尝试下面的一些方法后更新:

比较它们会一直失败.以下3项建议均无效.我相信我可以改变我处理它的方式,并通过传递一个键然后指向单独的列表<key, indexOfAction>然后通过索引删除它来使它成为我需要它的工作方式.但是,我觉得我仍然需要付出很大的努力来解决,所以我将提供更多信息,看看它是否有帮助.

这是清单:

private readonly IDictionary<Type, IList<Action<object>>> messageReceivedCallbacks;
Run Code Online (Sandbox Code Playgroud)

以下是将操作添加到列表的方式:

void AddMessageReceivedCallback<TMessage>(Action<TMessage> messageReceivedCallback)
    {
        var intermediateReceivedCallback = new Action<object>(m => 
            messageReceivedCallback((TMessage)m));

        var receivedList = messageReceivedCallbacks.GetOrCreateValue(typeof(TMessage), …
Run Code Online (Sandbox Code Playgroud)

c# generics comparison delegates

10
推荐指数
1
解决办法
3498
查看次数

标签 统计

c# ×1

comparison ×1

delegates ×1

generics ×1