LuaInterface - как зарегистрировать перегруженные методы? - PullRequest
0 голосов
/ 18 мая 2010

Я пытаюсь интегрировать Lua в свое приложение на C #, когда попадаю в ловушку. Я надеялся, что кто-то с большим опытом может помочь направить меня в правильном направлении.

Допустим, у меня есть следующие методы C #:

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

Я хотел бы зарегистрировать его в моей среде сценариев Lua, чтобы я мог сделать что-то вроде этого:

* +1007 *

Я пытался использовать RegisterFunction ("MyMethod", this, this.GetType (). GetMethod ("MyMethod")), но он обоснованно жалуется на неоднозначное соответствие. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 18 мая 2010

Исключение неоднозначного метода фактически возникает из-за вызова 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)");
    }

Это должно правильно вызвать ваши перегрузки.

В противном случае вам придется вызвать перегрузку GetMethod, которая принимает аргумент Type [] и привязать к отдельным функциям Lua, или придерживаться ответа @ Judge .

0 голосов
/ 18 мая 2010

Вы можете зарегистрировать функции под разными именами, а затем использовать чистую функцию Lua для отправки правильного метода, проверив аргументы

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

В качестве альтернативы, вы можете реализовать эту прокси-функцию в C # и связать ее, вместо этого напрямую связывая каждый перегруженный метод.

...