我正在尝试将一个javascript对象发送到c#world但我无法弄清楚如何完成。
这是我的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
有没有办法做到这一点?
答案 0 :(得分:0)
您发布的JavaScript代码无法解析。可能是您的特定JavaScript解释器非常宽松并将调用重新解释为myClass.Do('str')
?这可以解释零点。
答案 1 :(得分:0)
在.NET 4.0中,指定第二个参数是dynamic
,您应该获得可以使用的对象引用。在3.5及以下版本中,它将是某种类型的JsObject,但整个Microsoft.JScript命名空间不应该直接使用,所以我不太确定你是否可以指定你将使用JsObject。
“key”应该是字符串文字还是另一个变量的名称?您还错过了“测试”的结束报价。我严重怀疑JS的编译方式与编写完全正确。
答案 2 :(得分:0)
我必须在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);