2009-06-03 5 views
15

मैं इस हस्ताक्षरों के साथ मेरी कक्षा में दो कार्य है,एक्शन <T> को Func <T,Tres> में कनवर्ट करने का सबसे अच्छा तरीका क्या है?

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

कैसे मैं पहली बार एक के लिए दूसरी विधि में एक ही प्रतिनिधि पारित कर सकते हैं? प्रतिनिधि तर्क के साथ विधि बनाना एक तरीका नहीं है, क्योंकि मैं कुछ अपवाद सूचनाएं खो रहा हूं
बहुत बहुत धन्यवाद!

उत्तर

30

इसे डमी रिटर्न वैल्यू के साथ Func<T, TResult> के प्रतिनिधि के प्रतिनिधि में लपेटें, उदा।

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

आप सचमुच ऐसे कुछ को पारित करने के लिए कह रहे हैं जो किसी फ़ंक्शन को परिणाम प्रदान नहीं करता है जिसके लिए इसकी आवश्यकता होती है।
यह गैरकानूनी है।

आप आसानी से Func<T,TResult> फार्म Action<T> के किसी भी समारोह में बदल सकते हैं अगर आप कुछ परिणाम मूल्य (अनुमान से या स्पष्ट)

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

या

Func<T,TResult> MakeFixed<T,TResult>(Action<T> action, TResult result) 
{ 
    return t => { action(t); return result; }; 
} 
की आपूर्ति करने को तैयार हैं