2

我想要一个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);
        }
    }
}
4

4 回答 4

2

你的意思是这样吗?

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的任何类型。

于 2013-04-01T20:55:44.137 回答
2

如果我知道您想传入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>>你的函数,它不是泛型类型的,并且通过它的实现来支持多种类型。

于 2013-04-01T21:07:14.600 回答
1

我想我知道你的意思。看看这里。

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

于 2013-04-01T20:56:02.850 回答
0

解决编译器错误:

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

但不确定这是否是您实际想要实现的目标。

于 2013-04-01T20:56:25.523 回答