gpt4 book ai didi

c# - C# 中的通用 Func<> 类型

转载 作者:太空狗 更新时间:2023-10-30 00:26:37 26 4
gpt4 key购买 nike

我正在用 C# 编写一个小型 Lisp 解释器,它基本上已经可以工作了。目前我正在使用一个接口(interface)来表示函数:

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

该接口(interface)由多个类实现,用于内部(标准)函数、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?

最佳答案

Is there a possibility in C# to accept arbitrary lambdas to be called via reflection later?

那么您可以编写一个方法来获取任意委托(delegate):

public void AddFunction(string name, Delegate function)

但是,从 lambda 表达式的转换必须作为特定委托(delegate),因此您需要:

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

关于c# - C# 中的通用 Func<> 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10347634/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com