簡體   English   中英

在jint中將javascript對象傳遞給c#

[英]Passing a javascript object to c# in jint

我正在嘗試將一個JavaScript對象發送到C#世界,但我不知道如何完成。

這是我的JavaScript代碼

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

我已經嘗試過在c#類上使用這些方法簽名,第一個參數正確,但是第二個參數始終為null。

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

有什么辦法嗎?

您發布的JavaScript代碼無法解析。 可能是您的特定JavaScript解釋器很寬容並且將調用重新解釋為myClass.Do('str')嗎? 那將解釋為空。

在.NET 4.0中,指定第二個參數是dynamic並且應該獲得可以使用的對象引用。 在3.5及以下版本中,它將是某種JsObject,但是不應直接使用整個Microsoft.JScript命名空間,因此我不太確定是否可以指定使用JsObject。

是“鍵”應該是字符串文字還是另一個變量的名稱? 您還缺少“測試”的引號。 我嚴重懷疑JS是否會完全按照編寫的方式正確編譯。

我必須在Native \\ 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));

在該方法中,我將參數強制轉換為Dictionary以獲取值,但返回構造的JsObject。 如果任何屬性本身就是對象,則還可以將它們強制轉換為Dictionary:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM