2009-06-03 32 views
15

Tôi có hai chức năng trong lớp học của tôi có chữ ký này,Cách tốt nhất để chuyển đổi Action <T> thành Func <T,Tres> là gì?

public static TResult Execute<TResult>(Func<T, TResult> remoteCall); 
public static void Execute(Action<T> remoteCall) 

Làm thế nào tôi có thể vượt qua các đại biểu cùng trong phương pháp thứ hai để là người đầu tiên? Tạo phương thức với đối số Delegate không phải là một cách, bởi vì tôi đang mất một số thông tin ngoại lệ
Cảm ơn rất nhiều!

Trả lời

30

Bỏ nó vào đại biểu loại Func<T, TResult> với giá trị trả lại giả, ví dụ:

public static void Execute(Action<T> remoteCall) 
{ 
    Execute(t => { remoteCall(t); return true; }); 
} 
8

bạn đang yêu cầu truyền đạt thứ gì đó không cung cấp kết quả cho chức năng yêu cầu.
Điều này là vô nghĩa.

Bạn có thể dễ dàng chuyển đổi bất kỳ chức năng của Form Action<T> để Func<T,TResult> nếu bạn sẵn sàng để cung cấp một số giá trị kết quả (hoặc ngầm hoặc công khai)

Func<T,TResult> MakeDefault<T,TResult>(Action<T> action) 
{ 
    return t => { action(t); return default(TResult);}; 
} 

hoặc

Func<T,TResult> MakeFixed<T,TResult>(Action<T> action, TResult result) 
{ 
    return t => { action(t); return result; }; 
} 
Các vấn đề liên quan