通用函数功能<>键入在c#(Universal Func<> type in c#

2019-07-29 04:35发布

我正在写在C#中的小Lisp解释,它的基本工作了。 目前我使用的接口来表示的功能:

public interface LispFunction
{
    object Apply(ArrayList parameters);
}

的接口由多个类内部(标准)的功能,lambda表达式,宏扩展来实现,通过调用反射在.NET对象的方法等。 请注意,速度不是这里的问题,得到了解释器的只是喜悦,并在工作中使用它。

现在,我想我的小Lisp语言接受任意C#lambda表达式被解释中使用,就像这样:

Lisp foo = new Lisp();
foo.GlobalEnvironment.AddFunction("test", (bool a, int b) => a ? b : "whoops");
foo.Eval(foo.Read("(test #t 5)")); // Should evaluate to (object) 5

即来到我的脑海里第一件事情就是用Func<...>但我不得不使用大量的重载方法Func<a>Func<a, b> Func<a, b, c>等上。

有没有在C#中可能接受任意lambda表达式通过反射以后要叫什么?

Answer 1:

有没有在C#中可能接受任意lambda表达式通过反射以后要叫什么?

那么你可以编写采取任意委托的方法:

public void AddFunction(string name, Delegate function)

然而,从一个lambda表达式转换必须是为特定的委托,所以你需要:

Func<bool, string, string> function = (a, b) => a ? b : "whoops"
foo.GlobalEnvironment.AddFunction("test", function);

或呼叫中投:

foo.GlobalEnvironment.AddFunction("test",
    (Func<bool, string, string>)((a, b) => a ? b : "whoops"));

你可以把所有的超载在一个地方,保持AddFunction完全通用,但有这样一个静态类(有点像Tuple ):

public static class Func
{
    public Func<TResult> Create(Func<TResult> function) { return function; }

    public Func<T1, TResult> Create(Func<T1, TResult> function)
    {
        return function;
    }

    public Func<T1, T2, TResult> Create(Func<T1, T2, TResult> function)
    {
        return function;
    }

    // etc
}

这个类基本上存在方便。 然后你会打电话来:

foo.GlobalEnvironment.AddFunction("test",
    Func.Create((bool a, string b) => a ? b : "whoops"));


文章来源: Universal Func<> type in c#