我是一名程序员,我很懒。目前我正在使用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