函数包含另一个函数

Jon*_*eld 3 c# function

我有一组静态函数

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

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

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());
Run Code Online (Sandbox Code Playgroud)

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

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

我尝试过各种各样的事情,比如lambda表达式或动作,但我不能让它一般地工作,以便接受所有类型的函数.

pok*_*oke 6

当你这样做时,它会工作:

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());
Run Code Online (Sandbox Code Playgroud)

你可以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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Pipe(() => newList = GetListOfClassA(5, "myname"));
Pipe(() => newname = GetName(5));
Pipe(() => newListB = GetCompleteListOfClassB());
Run Code Online (Sandbox Code Playgroud)

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

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

前者的好处是可以清楚地看到副作用,即设置变量,而后者在变量可以保持未分配的情况下离开.