2014-02-17 45 views
0

所以基本上T有一個返回類型,我想要返回泛型返回類型。例如:傳遞參數Func <T>並獲取TResult

private TResult EndInvoke<T, TResult>(Func<T, TResult> asyncCaller, IAsyncResult asyncResult) 
{ 
    TResult result = default(TResult); 

    try 
    { 
     result = asyncCaller.EndInvoke(asyncResult); 
    } 
    catch (Exception exception) 
    { 
     // get exception details. 
    } 

    return result; 
} 

如何通過T調用方法並獲得TResult? 請注意,我只有T.

編輯:我的意思是我該如何稱此方法?

編輯:我想要一個通用的EndInvoke,因爲我是一個巨大的嘗試趕上不同的EndInvokes,那麼我想從EndInvoke的結果。

+1

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

'所以基本上T有一個返回類型'其實,你有返回類型'TResult'。這個問題還不清楚。 –

+0

該函數看起來像它的整個觀點(與另一個函數結合使用,可能名爲'BeginInvoke')是爲了啓用異步調用。如果你只有'T',想調用'asyncCaller',並且想要處理這個結果,那麼你只能使用同步調用。你能澄清你在做什麼嗎? – hvd

回答

0

不確定我是否理解正確,但我認爲如果您想要Func返回值,則應該放棄IAsyncResult。

例子:

private TResult GetResult<T, TResult>(Func<T, TResult> asyncCaller, IAsyncResult asyncResult) 
    { 
     TResult result = default(TResult); 
     result = asyncCaller(argument...); 

     return result; 
    } 
+0

函數的名稱問題,雖然,EndInvoke和IAsyncResult表明已經建立了一個異步調用。 – hvd

1

我建議你首先仿製EndInvoke<,>方法轉換爲擴展方法。

public static class FuncExtensions 
{ 
    public static TResult EndInvoke<T, TResult>(this Func<T, TResult> asyncCaller, IAsyncResult asyncResult) 
    { 
     // ... 
    } 
} 

這將簡化方法調用。作爲例子,我將調用一個計算整數平方的方法。

private int Square(int x) 
{ 
    return x * x; 
} 

在您的客戶端代碼,你會這樣稱呼它:

Func<int, int> caller = new Func<int, int>(Square); 

int x = 5; 

int y = default(int); 

caller.BeginInvoke(x, 
    asyncResult => 
    { 
     y = caller.EndInvoke(asyncResult); 
    }, 
    null); 

Console.WriteLine("The square of {0} is {1}", x, y); 

編輯

這個例子不以任何方式進行了測試,幷包含一個明顯的競爭條件。

相關問題