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

前端之家收集整理的这篇文章主要介绍了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);
}

猜你在找的C#相关文章