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)