0

少し問題が発生したときに、Lua を C# アプリに統合しようとしています。もっと専門知識のある人が正しい方向に向けてくれることを願っていました。

次の C# メソッドがあるとします。

public void MyMethod(int foo) { ... }
public void MyMethod(int foo, int bar) { ... }

次のようなことができるように、Lua スクリプト環境に登録したいと思います。

-- call method with one param
MyMethod(123)
-- call method with two params
MyMethod(123, 456)

RegisterFunction("MyMethod", this, this.GetType().GetMethod("MyMethod")) を試しましたが、あいまいな一致について合理的に文句を言います。何か案は?

4

2 に答える 2

2

あいまいなメソッド例外は、実際には への呼び出しが原因で発生GetMethodします。引数 への引数GetMethodが文字列 (メソッド名)Type[]であり、パラメーターに が指定されておらず、その名前のメソッドが複数ある場合、例外がスローされます。

質問のように単一のメソッドを厳密にバインドする必要がない場合は、LuaInterface テスト コードで示されているようにクラスを登録できます。

    private Lua _Lua;

    public void Init()
    {
        _Lua = new Lua();

        GC.Collect();  // runs GC to expose unprotected delegates
    }

    public void TestMethodOverloads()
    {
        Init();

        _Lua.DoString("luanet.load_assembly('mscorlib')");
        _Lua.DoString("luanet.load_assembly('TestLua')");
        _Lua.DoString("TestClass=luanet.import_type('LuaInterface.Tests.TestClass')");
        _Lua.DoString("test=TestClass()");
        _Lua.DoString("test:MethodOverload()");
        _Lua.DoString("test:MethodOverload(test)");
        _Lua.DoString("test:MethodOverload(1,1,1)");
        _Lua.DoString("test:MethodOverload(2,2,i)\r\nprint(i)");
    }

これにより、オーバーロードが正しく呼び出されるはずです。

それ以外の場合は、 Type[] 引数を取り、個別の Lua 関数にバインドする GetMethod オーバーロードを呼び出すか、 @Judge の answerに固執する必要があります。

于 2010-05-18T16:29:45.083 に答える
0

関数を異なる名前で登録してから、純粋な Lua 関数を使用して、引数をチェックして正しいメソッドにディスパッチすることができます。

function MyMethod(foo, bar)
    if bar then
        MyMethod1(foo, bar)
    else
        MyMethod2(foo)
    end
end

または、C# でこのプロキシ関数を実装し、オーバーロードされた各メソッドを直接バインドする代わりにバインドすることもできます。

于 2010-05-18T12:10:57.997 に答える