c# – 存储和调用一般类型的代理
发布时间:2020-12-15 06:50:22 所属栏目:百科 来源:网络整理
导读:我正在寻找的可能不会没有诉诸反思.如果是这样的话,我还是想知道最好的办法. 基本上,这就是我想要的代码如下: var instance = new MyClass();instance.Addint,string(x = x.ToString());instance.Addstring,Warehouse(x = Warehouse.LookupByName(x));insta
我正在寻找的可能不会没有诉诸反思.如果是这样的话,我还是想知道最好的办法.
基本上,这就是我想要的代码如下: 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); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |