我正在寻找的可能不会没有诉诸反思.如果是这样的话,我还是想知道最好的办法.
基本上,这就是我想要的代码如下:
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
我的问题是,如何在MyClass的列表中存储这些代理,每个代码都有不同的签名?当我想要使用每个返回值作为下一个的输入参数时,我可以稍后再调用它们?
MyClass的内部可能会很好的是List的一切.但我甚至不知道从哪里开始.
(最初,我想调用新的MyClass< int,string,Warehouse,IList& Supplier>(),但是由于没有“类型参数数组”,所以我放弃了这种方法.
解决方法
嗯,你可以把它们全部存储为代理 – 但是很棘手的是稍后调用它们.
如果您能够验证下一个代表在任何时候都是正确的类型,例如通过持有“当前输出”的类型引用,您可以始终存储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); }
然后调用它们全部:
object current = ...; // Wherever foreach (var func in list) { current = func(current); }