Silverlight Interop 2-Javascript呼叫Silverlight方法的Overloading
| | 0 | | ![]() |
先前文章文末提過一篇Silverlight interoperability,裡面有一句話
We have basic support for method overloading, by finding the overload which matches the number of arguments and by doing some basic parameter validation.
引起我的興趣,做了點研究,大致心得如下:
- 透過參數數目不同,Javascript呼叫時可精準地判別切換Overloading。(給個"讚"!)
- 如果參數數目相同,Siverlight Plugin還是能很粗略地依Javascript參數型別做判斷,但由於Javascript世界型別並不明確,判別精準度有限,如下面這個機車的例子:
public class JavascriptSidekick
{
[ScriptableMember]
public string Test(double d)
{
return "Double";
}
[ScriptableMember]
public string Test(bool b)
{
return "Bool";
}
[ScriptableMember]
public string Test(string s)
{
return "String";
}
[ScriptableMember]
public string Test(ScriptObject o)
{
return "ScriptObject";
}
}
用以下Javascript測試:alert(jssk.Test(1));
alert(jssk.Test(true));
alert(jssk.Test(3.14));
alert(jssk.Test("Darkthread"));
alert(jssk.Test(document.getElementById("form1")));
結果挺有趣的,1, true, 3.14都會得到Double,"Darkthread"得到String,getElementById("form1")則出現HtmlElement轉型String錯誤。如果把Souce Code中Test(bool b)的順序移到Test(double d)之前,則1, true, 3.14都會傳回Bool。
以此推測,Silverlight應是透過嘗試轉型來處理同參數數目的Overloading識別,1, true, 3.14都可被視為Boolean或Double,因此以Method的先後決定。而其餘非String的型別會被當成String處理,多半會造成轉型失敗。
由以上測試結果,建議不要依賴參數型別做為Javascript呼叫Silverlight時Overloading的依據,還是回歸參數數目區隔較為保險,避免自找麻煩。
Comments
Be the first to post a comment