2012-02-23 32 views
5

Trong lớp BLL, tôi đã viết:Cách sử dụng System.Action với kiểu trả về?

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

Trong Base Class BLL, tôi có một phương pháp:

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

Làm thế nào tôi có thể sử dụng phương pháp TryAction() với kiểu trả về chung chung? vui lòng đề xuất.

Trả lời

7

Bạn cần sử dụng Func để thể hiện một phương thức sẽ trả về một giá trị.

Dưới đây là một ví dụ

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)) 
     } 
    } 
+0

Cảm ơn đã giúp rất nhiều. – Pravin

6

Action là đại biểu có loại trả về void, vì vậy nếu bạn muốn trả lại giá trị, bạn không thể.

Đối với điều đó, bạn cần sử dụng đại biểu Func (có nhiều thông số loại cuối cùng là loại trả về).


Nếu bạn chỉ đơn giản là muốn có TryAction trở lại một kiểu generic, làm cho nó thành một phương pháp chung:

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

return default(T); 
} 

Tùy thuộc vào những gì chính xác bạn đang cố gắng để làm, có thể bạn cần sử dụng cả phương pháp chung và Func đại biểu:

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

return default(T); 
} 
0

Bạn nên cân nhắc sử dụng Func đại biểu thay vì Đại biểu hoạt động.

Các vấn đề liên quan