gpt4 book ai didi

c# - 函数包装另一个函数

转载 作者:行者123 更新时间:2023-11-30 13:54:50 25 4
gpt4 key购买 nike

我有一组静态函数,比如

internal static List<ClassA> GetListOfClassA (int id, string name) {...}
internal static string GetName (int id) {...}
internal static List<ClassB> GetCompleteListOfClassB() {...}

我想在这里完成的是以下内容(编写为伪代码)

List<ClassA> newList = new List<ClassA>;
string newname;
List<ClassB> newListB = new List<ClassB>;

Pipe (newList = GetListOfClassA (5, "myname"));
Pipe (newname = GetName (5));
Pipe (newListB = GetCompleteListOfClassB());

管道应该是一个函数,它接受另一个带有参数的函数,执行一些代码并允许将函数的值返回给调用者。管道应该做类似的事情

{
Console.WriteLine ("Test");
if (CertainCondition==true)
return GetName (value);
else
wait(250);
}

我尝试了各种方法,例如 lambda 表达式或操作,但我无法让它正常工作,因此无法接受所有类型的函数。

最佳答案

当你这样做时它会起作用:

List<ClassA> newList = new List<ClassA>();
string newname;
List<ClassB> newListB = new List<ClassB>();

newList = Pipe(() => GetListOfClassA(5, "myname"));
newname = Pipe(() => GetName(5));
newListB = Pipe(() => GetCompleteListOfClassB());

您可以像这样实现 Pipe:

public static T Pipe<T>(Func<T> action)
{
Console.WriteLine("Entering pipe");
if (someCondition)
return action();
else
{
// do something else; but you still need to return something
return default(T);
}
}

您也可以将其实现为一个函数,该函数本身不返回任何内容,但需要一个具有副作用(例如设置变量)的 Action:

Pipe(() => newList = GetListOfClassA(5, "myname"));
Pipe(() => newname = GetName(5));
Pipe(() => newListB = GetCompleteListOfClassB());

除了您不需要返回任何内容外,实现将非常相似:

public static T Pipe<T>(Func<T> action)
{
Console.WriteLine("Entering pipe");
if (someCondition)
action();
else
// do something else
}

前者的好处是可以清楚地看到副作用,即变量被设置,而后者让您处于变量可以保持未分配状态的情况。

关于c# - 函数包装另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38899253/

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