나는 프로그래머이며 게으른입니다. 현재 C#에서 일부 OpenAL 래퍼로 작업하고 있습니다. OpenAL 메서드를 호출 할 때마다 GetError
을 사용하여 OpenAL에서 오류를 요청해야합니다. 예외가 있으면 throw합니다. 다음 함수를 포함하는 정적 도우미 클래스를 추가하기까지는 시간이 오래 걸리지 않았습니다.일반 메서드에 대한 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)
으로 바꿨을 것이라고 생각했습니다.
슬프게도, 일단 내가 이것을 사용하기 시작하면 예외적으로 환영 받았다. 식은 method group', where a
변수 ', value' or
type'이 필요함을 나타냅니다.
이것이 작동하지 않는다고 슬프지만, 실제로 이것이 작동하지 않는 이유에 대해 궁금해졌습니다. Action
또는 과 같은 메서드를 전달할 수있는 이유는 무엇입니까?하지만 확장 메서드를 사용하면 작동하지 않습니다. 이것은 내가 사용하고있는 Mono 컴파일러 (.NET 4.0)의 제한 사항인가요? 아니면 사용중인 다른 것이 있습니까?
고마워요. 나는 이미 이것과 비슷한 것을 기대 했었지만 이것을 자세히 설명하는 것이 좋다. 실제로 AL에 대한 래퍼 클래스를 만드는 것을 이미 고려했습니다.이 클래스는 문제를 해결하는 데 도움이 될 수 있지만 지금은 함수를 인수로 전달하는 방법을 계속 사용합니다. – Tom