C# C如何将“any”函数作为参数传递给另一个函数

C# C如何将“any”函数作为参数传递给另一个函数,c#,C#,我有5个数据函数,它们都返回相同类型的对象列表 现在我必须在一个WCF中发布它们,在这个WCF中,我必须用大约50行的各种错误处理代码来包围被调用的代码 所以我想:因为代码51行除了获取数据的一行之外都是相同的,所以只需创建一个函数,其中包含所有错误处理,传递函数以获取数据作为该函数的参数 所以我有这些功能: GetAllSources() : List<Source> GetAllSourcesByTaskId(int taskId) : List<Source> Ge

我有5个数据函数,它们都返回相同类型的对象列表

现在我必须在一个WCF中发布它们,在这个WCF中,我必须用大约50行的各种错误处理代码来包围被调用的代码

所以我想:因为代码51行除了获取数据的一行之外都是相同的,所以只需创建一个函数,其中包含所有错误处理,传递函数以获取数据作为该函数的参数

所以我有这些功能:

GetAllSources() : List<Source>
GetAllSourcesByTaskId(int taskId) : List<Source>
GetAllSourcesByTaskIdPersonId(int taskId, int personId) : List<Source>
GetAllSourcesByDate(DateTime startDate, DateTime endDate): List<Source>
我希望能够将它们作为参数传递给函数

我应该如何声明被调用的函数

ps 我读过这个 但是它使用了一个Action对象,据我所知,它不能返回任何东西,我想返回一个列表

你可以传递一个可以接受许多输入参数的函数,返回一个值:

Func<T1, T2, TResult> 
您可以传递一个可接受多个输入参数并返回一个值的:

Func<T1, T2, TResult> 
这应该起作用:

public List<Source> GetList(Func<List<Source>> getListMethod) {
    return getListMethod();
}
List<Source> WithErrorHandling(Func<List<Source>> func)
{
    ...
    var ret = func();
    ...
    return ret;
 }
这应该起作用:

public List<Source> GetList(Func<List<Source>> getListMethod) {
    return getListMethod();
}
List<Source> WithErrorHandling(Func<List<Source>> func)
{
    ...
    var ret = func();
    ...
    return ret;
 }

您是否可以将列表作为参数传递到方法中,可能会更整洁一些?

您是否可以将列表作为参数传递到方法中,可能会更整洁一些?

好吧,您没有提到这些函数中的代码,但是如果您在内部使用linq,那么您的方法肯定不是最好的方法。 您应该使用如下内容:

IQueriable<SomeType> GetAllSources()
{
    return (from source in sources select ...);
}

IQueriable<SomeType> GetAllSourcesByTaskId(int taskId)
{
    return (GetAllSources()).Where(source => source.TaskId == taskId);
}

好吧,你没有提到这些函数中的代码,但是如果你在函数中使用linq,那么你的方法肯定不是最好的。 您应该使用如下内容:

IQueriable<SomeType> GetAllSources()
{
    return (from source in sources select ...);
}

IQueriable<SomeType> GetAllSourcesByTaskId(int taskId)
{
    return (GetAllSources()).Where(source => source.TaskId == taskId);
}

使用Func代替操作。给定的函数都采用不同的参数,您打算如何提供正确的参数?@Roger我试过了,但无法使其工作。在我看来,一个func只有一个签名,如果我错了,请纠正我的错误,因此当我为GetAllSources声明一个func时,我无法传递GetAllSourcesByTaskIdint taskId?@GregL:我不知道,但我想我可以这样做:List=GetDataFromGenericErrorHandlingFunctionDataService.GetAllSourcesByTaskId6@Michel您的示例只是调用Dataservice.GetAllSourcesByTaskKid函数,并将返回值传递给GetDataFromGenericErrorHandlingFunction方法。这很容易。我遗漏了什么吗?用Func代替动作。给定的函数都有不同的参数,你打算如何提供正确的参数?@Roger我试过了,但没能让它工作。在我看来,一个func只有一个签名,如果我错了,请纠正我的错误,因此当我为GetAllSources声明一个func时,我无法传递GetAllSourcesByTaskIdint taskId?@GregL:我不知道,但我想我可以这样做:List=GetDataFromGenericErrorHandlingFunctionDataService.GetAllSourcesByTaskId6@Michel您的示例只是调用Dataservice.GetAllSourcesByTaskKid函数,并将返回值传递给GetDataFromGenericErrorHandlingFunction方法。这很容易。我错过什么了吗?太好了!我没有做的是:=>{GetAllSourcesByTaskIdtaskId;};相反,我这样做了:GetAllSourcesByTaskIdtaskId;。当你有一个没有参数的函数时,这是可行的,所以这可以作为参数使用GetAllSources,但正如我现在知道的,当你传入一个带参数的函数时就不行了。太棒了!我没有做的是:=>{GetAllSourcesByTaskIdtaskId;};相反,我这样做了:GetAllSourcesByTaskIdtaskId;。当你有一个不带参数的函数时,这是可行的,所以这可以作为参数使用GetAllSources,但正如我现在知道的,当你传入一个带参数的函数时就不行了。