我是一名程序員,我很懶。目前我正在使用C#中的一些OpenAL包裝器。每次我調用OpenAL方法時,我都必須使用GetError
來從OpenAL請求錯誤,如果有錯誤,我會拋出異常。直到我添加了一個包含以下功能的靜態幫助類才花了很長時間:常規方法Action/Func的擴展方法
public static void Check()
{
ALError error;
if ((error = AL.GetError()) != ALError.NoError)
throw new InvalidOperationException(AL.GetErrorString(error));
}
這個工作了一段時間,但我想要更多。因此,一段時間後,我想出了以下方法:
public static void Call(Action function)
{
function();
ALHelper.Check();
}
public static void Call<TParameter>(Action<TParameter> function, TParameter parameter)
{
function(parameter);
ALHelper.Check();
}
public static TReturn Eval<TReturn>(Func<TReturn> function)
{
var val = function();
ALHelper.Check();
return val;
}
public static TReturn Eval<TParameter, TReturn>(Func<TParameter, TReturn> function, TParameter parameter)
{
var val = function(parameter);
ALHelper.Check();
return val;
}
這個工作很大,但我還是不開心時的代碼究竟如何看,所以我決定把它一步:我將上述方法轉換爲擴展方法。因爲我知道我可以通過Action
和Func
參數的方法,所以我認爲它可以用於擴展方法,將醜陋的handles = ALHelper.Eval(AL.GenBuffers, amount)
變成更優雅的handles = AL.GenBuffers.Eval(amount)
。
不幸的是,一旦我開始使用它,我受到了一個例外的歡迎:Expression表示一個method group', where a
變量,'value' or
'類型'是預期的。
有點傷心,這不起作用,我真的很好奇,爲什麼這不起作用。究竟是什麼原因,您可以通過方法Action
或Func
,但使用擴展方法不起作用?這是我正在使用的單聲道編譯器(.NET 4.0)的限制嗎,還是有其他內容?
非常感謝。我已經預料到與此類似的東西,但很高興看到詳細解釋。我確實已經考慮爲AL創建自己的包裝類,它可能會幫助很多事情,但現在我會堅持將該函數作爲參數傳遞。 – Tom 2014-10-18 13:05:32