如何在C#中使用未知数量和参数类型包装Func <T1 ... Tn>?

假设我有这个课程:

public class Function {
    public int argc;        //number of arguments of the function
    public float[] argv;
    public Func<float> f;   //attribute to store a function (e.g. Sin(x) or Pow(a,b))
}

我想创建包含不同功能的Function实例,例如Sin(x)Pow(a,b),但是我不知道如何绑定现有函数(带有任意数量的参数) )到Func。显然,其声明并不总是Func<float>,而是Func<float,float>Func<float,float,float>等。

我一直在寻找Funcdelegateaction,但仍然不知道如何拥有可以容纳和执行不同数量功能的“功能胶囊”论点。为简单起见,我认为唯一的输入和输出类型是float

我正在考虑使用Func<List<float>>之类的东西,但我想知道是否有更好的选择。

hnhhdzh 回答:如何在C#中使用未知数量和参数类型包装Func <T1 ... Tn>?

我想提出一个更符合OP描述的方案的答案。关键在于使用Delegate.DynamicInvoke,它使您可以将不确定数量的参数传递给委托。

public class Function<TReturn> {
    private readonly object[] _argv;

    private readonly Delegate _func;

    public Function(Delegate func,params object[] args) {
        _func = func;
        _argv = args;
    }

    public TReturn Run() {
        object v = _func.DynamicInvoke(_argv);
        return (TReturn)v;
    }
}

它的用法可让您动态决定要传递的参数数量:

var s = new Function<double>((Func<double,double>)(x => Math.Sin(x)),1 );
Console.WriteLine(s.Run()); // prints 0.8414709848078965

var p = new Function<double>((Func<double,double,double>)((a,b) => Math.Pow(a,b)),2,3);
Console.WriteLine(p.Run()); // prints 8

var d = new Function<string>((Func<string,string>)((a,b) => a + b.ToString()),"hello,",42);
Console.WriteLine(p.Run()); // prints "hello,42"

请注意,由于类型检查是动态的,因此仅在运行时在调用Function.Run()时执行类型检查,而在构造Function对象时不执行类型检查。如果您确定所有传递的参数将始终为同一类型,则可以通过添加一个TArg泛型类型来静态地强制执行该操作。

本文链接:https://www.f2er.com/3143006.html

大家都在问