我有一组静态函数
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表达式或动作,但我不能让它一般地工作,以便接受所有类型的函数.
当你这样做时,它会工作:
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)
前者的好处是可以清楚地看到副作用,即设置变量,而后者在变量可以保持未分配的情况下离开.