存储和调用一般类型的委托

Ell*_*son 9 c# generics delegates

如果不诉诸反思,我正在寻找的东西可能是不可能的.如果是这样的话,我仍然想知道最好的解决方法.

从本质上讲,这就是我希望我的代码看起来像:

var instance = new MyClass();
instance.Add<int, string>(x => x.ToString());
instance.Add<string, Warehouse>(x => Warehouse.LookupByName(x));
instance.Add<Warehouse, IList<Supplier>>(x => x.Suppliers());

instance.Chain(3);    // should call each lambda expression in turn
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何在MyClass的列表中存储这些具有不同签名的代理?以后我怎么能在我想要的时候调用它们,使用每个的返回值作为下一个的输入参数?

MyClass的内部很可能是List的混乱和所有这一切.但我甚至不确定从哪里开始.

(原来,我想打电话new MyClass<int, string, Warehouse, IList<Supplier>>().但是,由于没有"类型参数数组",我放弃了这种方法.)

Jon*_*eet 11

好吧,你可以将它们全部存储起来Delegate- 但是棘手的是稍后再调用它们.

如果您能够在任何时候验证下一个委托是否属于正确的类型,例如通过持有Type"当前输出" 的引用,您可以随时存储List<Func<object, object>>并使您的Add方法类似于:

public void Add<TIn, TOut>(Func<TIn, TOut> func)
{
    // TODO: Consider using IsAssignableFrom etc
    if (currentOutputType != typeof(TIn))
    {
        throw new InvalidOperationException(...);
    }
    list.Add(o => (object) func((TIn) o));
    currentOutputType = typeof(TOut);
}
Run Code Online (Sandbox Code Playgroud)

然后调用它们:

object current = ...; // Wherever
foreach (var func in list)
{
    current = func(current);
}
Run Code Online (Sandbox Code Playgroud)