我想要一个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);
}
}
}
答案 0 :(得分: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
的任何类型。
答案 1 :(得分: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>>
传递给你的函数,该函数不是通用类型的,并且通过它的实现支持多种类型。
答案 2 :(得分:1)
我想我知道你的意思。看看这里。
http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx
答案 3 :(得分:0)
解决编译错误:
class InternalBusService<T>
{
public InternalBusService(IEnumerable<Action<T>> subscriptions) { }
}
但不确定这是你想要实现的目标。