微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 存储和调用一般类型的代理

我正在寻找的可能不会没有诉诸反思.如果是这样的话,我还是想知道最好的办法.

基本上,这就是我想要的代码如下:

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);
}

原文地址:https://www.jb51.cc/csharp/94448.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐