【问题标题】:How to invoke generic Action<T>? [duplicate]如何调用泛型 Action<T>? [复制]
【发布时间】:2020-05-01 00:14:21
【问题描述】:

为了创建一个简单的事件总线来实现微服务的通信基础设施,我提出了这个问题:

如何调用具有不同泛型类型的多个 Action?

【问题讨论】:

  • 这里可能有一些有趣的问题......但目前的帖子没有提供任何细节来说明为什么它与标准副本有任何不同。澄清这实际上可以解决这篇文章的两个问题 - 没有显示任何研究/不清楚以及解释为什么它不应该作为重复而关闭。请注意,仅提供答案是不够的,因为仅此一项并不能说明问题。
  • 您提到的副本不处理 Action。我花了一些思考杂技来理解“调用”方法在动作内部。希望这可以为其他人节省一些时间。

标签: c# generics action


【解决方案1】:

我对这个问题的解决方案:

void Main()
{
    var data = new object[] { new ProviderA(), new ProviderB() };

    var events = new List<object> {
        new Action<ProviderA>(provider => provider.Fire()),
        new Action<ProviderB>(provider => provider.Fire())
    };

    Invoke(events[0], data);
    Invoke(events[1], data);
}

void Invoke(object action, object[] data)
{
    var genericActionType = action.GetType().GenericTypeArguments[0];
    var dataObject = data.First(f => f.GetType() == genericActionType);

    var genericAction = typeof(Action<>).MakeGenericType(dataObject.GetType());
    genericAction.GetMethod("Invoke").Invoke(action, new object[]{ dataObject });
}

public class ProviderA
{
    public void Fire() { Console.WriteLine("Provider A fired"); }
}

public class ProviderB
{
    public void Fire() { Console.WriteLine("Provider B fired"); }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多