2010-05-18 68 views
0

當我遇到一個小障礙時,我試圖將Lua整合到我的C#應用​​程序中。我希望有更多專業知識的人能幫助我指出正確的方向。LuaInterface - 如何註冊重載的方法?

比方說,我有以下的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」)),但它合理地抱怨模糊匹配。有任何想法嗎?

回答

0

你可以註冊名稱不同的功能,然後通過檢查參數

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

或者使用純Lua的功能派遣到正確的方法,你可以實現在C#和綁定是不是這個代理功能直接綁定每個重載的方法。而不指定參數a Type[]當參數GetMethod是一個字符串(方法名稱),並有一個以上的方法,通過該名稱,則:

+0

謝謝法官。我想沒有代理方法的乾淨方法嗎?代理方法感覺像一個黑客:) – JeffreySadeli 2010-05-18 14:42:21

+0

這不是一個真正的黑客;這就是Lua中如何處理可變參數。我想你可以稱任何不同的語言界面爲黑客。 ;) – 2010-05-18 19:17:16

2

模棱兩可的方法例外實際上是因爲調用GetMethod的凸起拋出異常。

如果你沒有在你的問題嚴格綁定單一的方法一樣,可以作爲證明in the LuaInterface test code註冊類:

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)"); 
    } 

這應該正確地調用您的重載。

否則,你將不得不打電話the GetMethod overload that takes a Type[] argument並綁定到單獨的Lua函數,或堅持與@Judge's answer

+0

感謝馬克,看起來像我會使用法官的詭計和你的這個工作。再次感謝您的幫助。 – JeffreySadeli 2010-05-18 19:16:48