来自基类型的动作泛型

本文关键字:泛型 类型 基类 | 更新日期: 2023-09-27 18:07:00

我想要一个IEnumerable<Action<T>> subscriptions,这是一个动作数组,每个动作都有不同的类型参数-我想把一个列表传递给一个服务构造函数来循环这些并注册,但编译器抱怨(不足为奇)。

是否有任何方法可以实现传入具有派生特定实现的基类型并循环遍历列表的能力?

class InternalBusService
{
    private InternalBus bus;
    public InternalBusService(IEnumerable<Action<T>> subscriptions)
    {
        foreach (var subscription in subscriptions)
        {
            this.bus.Subscribe<T>(subscription);
        }
    }
}

来自基类型的动作泛型

如果我理解你想在IEnumerable<Action<T>>中传递T在可枚举的每个动作不是同一类型,那是不可能的方式,你正在做它。

也许你可以做一些类似下面的"概念代码"(意思是它只是向你展示我的想法,它不一定是一个解决方案)。
public interface IActionWrapper
{
    bool AcceptsParameterType(Type t);
    void PerformAction(object o);
}
public class ActionWrapper<T> : IActionWrapper
{
    Action<T> yourAction {get;set;}
    public bool AcceptsParameterType(Type t)
{
return t is T;
}
public void PerformAction(object o)
{
  yourAction((T)o);
}
}

然后你可以把IEnumerable<IActionWrapper>>传递给你的函数,它不是泛型的,它的实现将支持多种类型。

你的意思是这样吗?

class InternalBusService<T>
    where T : SomeType
{
    public InternalBusService(IEnumerable<Action<T>> subscriptions)
    {
        foreach (var subscription in subscriptions)
        {
            this.bus.Subscribe<T>(subscription);
        }
    }
}

where T : SomeType可以是您想要限制T的任何类型。

我想我明白你的意思。请看这里

http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx

解决编译错误:

class InternalBusService<T>
{
    public InternalBusService(IEnumerable<Action<T>> subscriptions) { }
}

但不确定这就是你想要达到的效果