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



我正在考虑将我们的应用程序从使用 JavaScript.NET(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;
        }
    }
}

注意:我知道我可以使用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);
    }
}

相关内容

  • 没有找到相关文章

最新更新