Javascript 如何使用Clearscript将CLR类型的本机JS数组转换为CLR数组

Javascript 如何使用Clearscript将CLR类型的本机JS数组转换为CLR数组,javascript,c#,type-conversion,clr,clearscript,Javascript,C#,Type Conversion,Clr,Clearscript,我正在考虑将我们的应用程序从使用(Noesis)转换为使用ClearScript 我们的应用程序包含大量用于财务计算的用户创建的Javascript算法/表达式-如果可能的话,我宁愿避免更改这些算法/表达式 目前,在JavaScript.NET中,许多用户定义的算法遵循一种模式,即创建包含主机类型的JavaScript数组,并将其作为参数传递给另一个主机类型上的函数。在JavaScript.NET中,这种转换“只起作用”。请参阅下面的代码,了解我正在尝试执行的操作: using System;

我正在考虑将我们的应用程序从使用(Noesis)转换为使用ClearScript

我们的应用程序包含大量用于财务计算的用户创建的Javascript算法/表达式-如果可能的话,我宁愿避免更改这些算法/表达式

目前,在JavaScript.NET中,许多用户定义的算法遵循一种模式,即创建包含主机类型的JavaScript数组,并将其作为参数传递给另一个主机类型上的函数。在JavaScript.NET中,这种转换“只起作用”。请参阅下面的代码,了解我正在尝试执行的操作:

using System;
using Microsoft.ClearScript;
using Microsoft.ClearScript.V8;

namespace ClearscriptPlayground
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var engine = new V8ScriptEngine())

            {
                var myClass = new MyClass();;
                engine.AddHostObject("instance", myClass);
                engine.AddHostType("MyType", HostItemFlags.DirectAccess, typeof(MyType));
                engine.Execute(
                        @"var params = [new MyType('bye', 10), 
                                        new MyType('hello', 10)];

                          instance.SomethingElse(params)");

                Console.ReadLine();
            }
        }
    }

    public class MyClass
    {
//        public void SomethingElse(ITypedArray<MyType> foo)
//        {
//            // Doesn't work.
//        }

//        public void SomethingElse(MyType[] foo)
//        {
//            // Doesn't work.
//        }

//        public void SomethingElse(dynamic foo)
//        {
//            var mapped = foo as ITypedArray<MyType>; // Doesn't work
//            var mapped = foo as MyType[]; // Doesn't work either   
//        }

        public void SomethingElse(ScriptObject foo)
        {
            // Works, but how best to convert to MyType[] or similar?
        }
    }

    public struct MyType
    {
        public string Foo;
        public int Bar;

        public MyType(string foo, int bar)
        {
            Foo = foo;
            Bar = bar;
        }
    }
}
使用系统;
使用Microsoft.ClearScript;
使用Microsoft.ClearScript.V8;
命名空间清除脚本
{
班级计划
{
静态void Main(字符串[]参数)
{
使用(var engine=new V8ScriptEngine())
{
var myClass=new myClass();;
AddHostObject(“实例”,myClass);
engine.AddHostType(“MyType”,HostItemFlags.DirectAccess,typeof(MyType));
引擎,执行(
@“var params=[new MyType('bye',10),
新MyType('hello',10)];
例如,SomethingElse(params)”;
Console.ReadLine();
}
}
}
公共类MyClass
{
//公共空间某些东西(ITypedArray foo)
//        {
////不起作用。
//        }
//公共void SomethingElse(MyType[]foo)
//        {
////不起作用。
//        }
//公共void SomethingElse(动态foo)
//        {
//var mapped=foo作为ITypedArray;//不起作用
//var mapped=foo as MyType[];//也不起作用
//        }
公共void SomethingElse(ScriptObject foo)
{
//可以,但如何最好地转换为MyType[]或类似的格式?
}
}
公共结构MyType
{
公共字符串Foo;
公共酒吧;
公共MyType(字符串foo,int bar)
{
Foo=Foo;
巴=巴;
}
}
}

NB:我知道我可以使用
params=host.newArr(MyType,2)创建主机数组,这将起作用——但这将意味着修改所有用户维护的JavaScript,这是我真正希望避免的

您可以通过
dynamic
直接使用JavaScript数组:

public void SomethingElse(dynamic foo)
{
    var length = foo.length;
    for (var i = 0; i < length; ++i)
    {
        var my = (MyType)foo[i];
        Console.WriteLine("{0} {1}", my.Foo, my.Bar);
    }
}
public void SomethingElse(动态foo)
{
变量长度=foo.length;
对于(变量i=0;i
JavaScript.NET是谷歌V8 JavaScript引擎()的CLR接口。ClearScript是一个替代库,可以做很多相同的事情。