如何使用返回类型的System.Action?

时间:2012-02-23 14:19:02

标签: asp.net .net c#-4.0 action

在BLL课程中,我写道:

Private List<T> GetData(string a, string b)
{
   TryAction(()=>{
      //Call BLL Method to retrieve the list of BO.
       return BLLInstance.GetAllList(a,b);
    });
}

在BLL基类中,我有一个方法:

protected void TryAction(Action action)
{
 try
 {
   action();
 }
 catch(Exception e)
 {
   // write exception to output (Response.Write(str))
 }
}

如何将TryAction()方法与泛型返回类型一起使用? 请有个建议。

3 个答案:

答案 0 :(得分:7)

您需要使用Func来表示将返回值的方法。

以下是一个例子

    private List<int> GetData(string a, string b)
    {
        return TryAction(() =>
        {
            //Call BLL Method to retrieve the list of BO.
            return BLLInstance.GetAllList(a,b);
        });
    }


    protected TResult TryAction<TResult>(Func<TResult> action)
    {
        try
        {
            return action();
        }
        catch (Exception e)
        {
            throw;
            // write exception to output (Response.Write(str))
        }
    }

答案 1 :(得分:6)

Action是一个具有void返回类型的委托,因此如果您希望它返回一个值,则不能。

为此,您需要使用Func委托(有很多 - 最后一个类型参数是返回类型)。


如果您只想让TryAction返回泛型类型,请将其转换为通用方法:

protected T TryAction<T>(Action action)
{
 try
 {
   action();
 }
 catch(Exception e)
 {
   // write exception to output (Response.Write(str))
 }

 return default(T);
}

根据您的具体操作,您可能需要使用通用方法和Func委托:

protected T TryAction<T>(Func<T> action)
{
 try
 {
   return action();
 }
 catch(Exception e)
 {
   // write exception to output (Response.Write(str))
 }

 return default(T);
}

答案 2 :(得分:0)

您应该考虑使用Func委托而不是Action委托。