我有一组静态函数,比如
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表达式或动作的东西,但我不能让它一直工作,以便接受所有类型的函数。
答案 0 :(得分:6)
当你这样做时会起作用:
SELECT
Date,
FundCode,
Price
FROM
PriceHistory H
INNER JOIN
/* this nested query gives the max date for each fund*/
(SELECT
FundCode,
max(Date) AS MaxDate
FROM
PriceHistory H2
WHERE
Date<=@DateToSearchFor
GROUP BY
FundCode) AS RowSelector
ON H.FundCode=RowSelector.FundCode AND H.Date=RowSelector.MaxDate
您可以像这样实施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());
前者的好处是可以清楚地看到副作用,即设置的变量,而后者在变量可以保持未分配的情况下离开。
答案 1 :(得分:2)
我的第一个猜测是Pipe没有将任何参数传递给&#39; GetName&#39;功能
在这种情况下,您可以让Pipe接受Action
并像
Pipe(() => newList = GetListOfClassA(5, "myname"));
答案 2 :(得分:0)
问题是你必须为你想要评估的每个参数提供一个通用版本,如上所述。对于GetListOfClassA
的示例,它有2个参数和一个返回类型,您可以按如下方式执行此操作。
public TResult Pipe<T1,T2,TResult>(Func<T1,T2,TResult> f, T1 arg1, T2 arg2)
{
Console.WriteLine ("Test");
if (CertainCondition==true)
return f(arg1, arg2);
else
wait(250);
}
可以按如下方式调用此函数。
Pipe( GetListOfClassA, 5, "myname" );
您必须为不同数量的参数提供类似的版本。