2010-09-16 14 views
0

我試圖發送一個JavaScript對象爲C#的世界,但我無法弄清楚如何做。傳遞一個JavaScript對象爲C#在jint

這裏是我的javascript代碼

myClass.Do('str', { key : 'Testing' }); 

我試圖對C#類這些方法簽名,第一個參數是正確的,但第二個參數始終是零。

public Do(string param1, object param2); // param1 = 'str', param2 = null 
public Do(string param1, dynamic param2); // param1 = 'str', param2 = null 
public Do(string param1, JsObject param2); // param1 = 'str', param2 = null 
public Do(string param1, JsDictionary param2); // param1 = 'str', param2 = null 
public Do(string param1, ArgumentClass param2); // param1 = 'str', param2 = null 
public Do(string param1, object[] param2); // throws method not found 

有沒有辦法做到這一點?

+0

我有固定的缺失報價語法 – ertan 2010-09-17 11:10:34

回答

0

我不得不修改這一方法在純\ JsClr.cs

public static object ConvertParameter(JsInstance parameter) 
{ 
    if (parameter.Class != JsFunction.TYPEOF && parameter.Class != JsArray.TYPEOF && parameter.Class != JsObject.TYPEOF) 
    { 
     return parameter.Value; 
    } 
    else if (parameter == JsNull.Instance) 
    { 
     return null; 
    } 
    else 
    { 
     JsFunction constructor = ((JsDictionaryObject)parameter)["constructor"] as JsFunction; 
     if (constructor == null) return parameter; 

     switch (constructor.Name) 
     { 
      case "Date": 
       return JsDateConstructor.CreateDateTime(parameter.ToNumber()); 
      case "String": 
      case "RegExp": 
      case "Number": 
       return parameter.Value; 
      case "Array": 
       object[] array = new object[((JsObject)parameter).Length]; 
       foreach (KeyValuePair<string, JsInstance> key in (JsObject)parameter) 
       { 
        int index = 0; 
        if (int.TryParse(key.Key, out index)) 
        { 
         array[index] = ConvertParameters(key.Value)[0]; 
        } 
       } 
       return array; 
      case "Object": 

       if (parameter.Class == JsFunction.TYPEOF) return parameter; 

       Dictionary<string, object> dic = new Dictionary<string, object>(); 
       foreach (KeyValuePair<string, JsInstance> key in (JsObject)parameter) 
       { 
        dic.Add(key.Key, ConvertParameter(key.Value)); 
       } 
       return dic; 
      default: 
       return parameter; 
     } 
    } 

} 

這裏的功能設置:

m_Engine = new JintEngine(Options.Ecmascript3); 
m_Engine.SetFunction("Compute", new Jint.Delegates.Func<object, object>(JSCompute)); 

在我投的參數詞典的方法來獲取值,但回報一個構造的JsObject。如果任何屬性是對象本身,你可以施展他們的字典也:

public object JSCompute(object o) 
{ 
    Dictionary<string, object> properties = (Dictionary<string, object>)o; 
    double x = (int)((double)properties["X"]); 
    double y = (int)((double)properties["Y"]); 
    double width = (int)((double)properties["Width"]); 
    double height = (int)((double)properties["Height"]); 

    JsObject results = new JsObject(); 
    results["Area"] = new JsNumber(width * height); 
    results["Diagonal"] = new JsNumber(Math.Sqrt(x * x + y * y)); 
    return results; 
} 

這裏的JavaScript:

var rectangle = { "X": 5, "Y": 10, "Width": 20, "Height": 10 }; 
var result = Compute(rectangle); 
alert('Area is ' + result.Area + ', Diagonal is ' + result.Diagonal); 
+0

你正在使用哪個版本?我已經嘗試了jint的v0.8.8的確切示例,但在JSFindAll方法中o參數仍爲null。 – ertan 2010-09-17 19:04:21

+0

對不起,我忘了我從0.8.8源代碼中改變了一種方法。我編輯了包含更改代碼的答案,如果您瀏覽源代碼,則它位於JINT站點上。 – 2010-09-17 21:35:25

0

您發佈不解析JavaScript代碼。難道說你的特殊JavaScript解釋器是非常寬鬆的,並重新詮釋了呼叫作爲myClass.Do('str')?這將解釋空值。

0

在.NET 4.0中,指定第二個參數是dynamic,你應該得到一個對象的引用,你可以工作。在3.5以下,這將是某種形式的JsObject,但不應該在整個Microsoft.JScript命名空間直接使用,所以我也不太清楚,如果你可以指定你會採取JsObject。

是「鑰匙」應該是一個字符串文字或其他變量的名稱?您還錯過了「測試」的結束報價。我嚴重懷疑JS會按照書面正確編譯。

+0

謝謝你,但我已經嘗試了「動態「也不起作用。順便說一句我正在使用jint而不是Microsoft.JScript ns。 – ertan 2010-09-17 11:19:07

相關問題