Tom*_*Tom 5 c# extension-methods action
我是一名程序员,而且我很懒。目前,我正在使用C#中的一些OpenAL包装器。每次我调用OpenAL方法时,都必须使用OpenAL请求错误GetError,如果有错误,则会抛出异常。不久之后,我添加了一个包含以下功能的静态帮助器类:
public static void Check()
{
ALError error;
if ((error = AL.GetError()) != ALError.NoError)
throw new InvalidOperationException(AL.GetErrorString(error));
}
Run Code Online (Sandbox Code Playgroud)
这工作了一段时间,但我想要更多。因此,过了一会儿,我想出了以下方法:
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;
}
Run Code Online (Sandbox Code Playgroud)
这很好用,但是我仍然对使用时的代码外观不满意,因此我决定将其进一步:将上述方法转换为扩展方法。据我所知,我可以将方法作为Action和Func参数传递,我认为它对于扩展方法同样适用,从而使丑陋的外观handles = ALHelper.Eval(AL.GenBuffers, amount)变得更加优雅handles = AL.GenBuffers.Eval(amount)。
可悲的是,一旦我开始使用它,我就受到了例外的欢迎:表达式表示一个method group', where a变量“,value' or类型”。
有点遗憾的是这行不通,实际上我很好奇为什么这行不通。您可以通过as Action或方法来传递方法Func,但不能使用扩展方法的原因到底是什么呢?这是我正在使用(.NET 4.0)使用的Mono编译器的限制,还是内部发生了其他事情?
小智 1
当您编写 时handles = ALHelper.Eval(AL.GenBuffers, amount),AL.GenBuffers不是任何类型的委托。重载解析会考虑所有重载,ALHelper.Eval并准确找到一种表达式AL.GenBuffers可以转换为的委托类型。
当您编写 时handles = AL.GenBuffers.Eval(amount),AL.GenBuffers仍然不是任何类型的委托,因此AL.GenBuffers.Eval不匹配任何方法,并且重载解析无法帮助找到最佳匹配。
您将能够编写new Func<T, TResult>(AL.GenBuffers).Eval(...),原则上,扩展方法确实适用于委托类型,但这比您已经拥有的更糟糕。
这不是 Mono 特有的。
我要做的是创建一个类(比方说MyAL),并为所有AL函数提供包装器。然后来电者可以说handles = MyAL.GenBuffers(amount);。
| 归档时间: |
|
| 查看次数: |
1514 次 |
| 最近记录: |