从参数调用方法(带任何参数)

时间:2014-01-14 08:32:36

标签: c# opentk

我正在尝试用OpenTK编写游戏。 我想每次从GL课程中调用一些东西时检查错误。

所以,让我说,我有这个课程:

public static class GLCheck
{
    public static void Call(function f)
    {
        // Call f function
        CheckError();
    }

    public static void CheckError()
    {
        ErrorCode errorCode = GL.GetError();

        if (errorCode != ErrorCode.NoError)
            Console.WriteLine("Error!");
    }
}

所以我可以这样调用函数:

GLCheck.Call(GL.ClearColor(Color.White));
GLCheck.Call(GL.MatrixMode(MatrixMode.Modelview));
GLCheck.Call(GL.PushMatrix());

我该怎么做? 感谢

----------------- 答案: -----------------

感谢您的回答! 我只是意识到所有答案都使用了委托(行动 Func<> ) 在.NET 2.0上,这不可用,所以你必须创建自己的,这里是我的GLCheck类:

public static class GLCheck
{
    public delegate void Action();
    public delegate void Action<T1, T2>(T1 arg1, T2 arg2);
    public delegate void Action<T1, T2, T3>(T1 arg1, T2 arg2, T3 arg3);
    public delegate void Action<T1, T2, T3, T4>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
    public delegate TResult Func<TResult>();
    public delegate TResult Func<T, TResult>(T arg);
    public delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2);
    public delegate TResult Func<T1, T2, T3, TResult>(T1 arg1, T2 arg2, T3 arg3);
    public delegate TResult Func<T1, T2, T3, T4, TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);

    public static void Call(Action callback)
    {
        callback();
        CheckError();
    }

    public static void Call<T>(Action<T> func, T parameter)
    {
        func(parameter);
        CheckError();
    }
}

再次感谢您的回答!

3 个答案:

答案 0 :(得分:2)

它不会很整洁,但您可以使用Lambda函数轻松完成此操作:

GLCheck.Call(() => GL.ClearColor(Color.White));
GLCheck.Call(() => GL.MatrixMode(MatrixMode.Modelview));
GLCheck.Call(() => GL.PushMatrix());

Call将被定义为:

public static void Call(Action a)
{
    a();
    CheckError();
}

对于没有参数的方法GL方法,您可以更干净地传递它们:

GLCheck.Call(GL.PushMatrix);

(请注意()之后没有PushMatrix。)

答案 1 :(得分:2)

您可以使用泛型来创建这样的内容:

private void Call<T> (Action<T> func, T parameter)
{
    func(parameter);
    CheckError();
}

其中T将是一个参数。或者您可以按照建议使用例外。

答案 2 :(得分:0)

也许您应该在GL之上编写自己的API,从而产生更清晰的代码。即

public class MyGL
{
    private TypeHere GL = new TypeHere();

    public void ClearColor(Color color)
    {
        GL.ClearColor(color);
        CheckError();
    }

    private void CheckError()
    {
        ErrorCode errorCode = GL.GetError();

        if (errorCode != ErrorCode.NoError)
            Console.WriteLine("Error!");
    }
}

因此,您可以使用更清晰易读的代码来调用它

MyGL.ClearColor(Color.White);