zoukankan      html  css  js  c++  java
  • IronJS可变参数的函数

    IronJS在github上wiki上有示例代码说明如何输出一个CLR的函数到JS环境中去,但是他只说明了怎样输出一个固定参数的函数,未提及可变参数的问题。甚至于IronJS.Native.Utils.CreateFunction()必须通过第2个参数将CLR函数的参数个数告知IronJS。

    C#的Console.WriteLine()函数用起来还是比较爽的,如何在JS环境中创建一个print(format, …)函数呢?通过JS函数的arguments可以轻松搞定这件事情,代码如下:

    using System;
    using System.Collections.Generic;
    using IronJS;
    using IronJS.Runtime;
    
    class Script
    {
        static void print(BoxedValue arguments)
        {
            Func<string, object> arg = name =>
            {
                return arguments.Object.Members[name];
            };
    
            int length = (int)(double)arg("length"); // js中只有double
            if (length == 0)
            {
                return;
            }
    
            string format = arg("0").ToString();
            if (length == 1)
            {
                Console.WriteLine(format);
                return;
            }
    
            object[] objs = new object[length - 1];
            for (int i = 1; i < length; i++)
            {
                objs[i - 1] = arg(i.ToString());
            }
            Console.WriteLine(format, objs);       
        }
    
        [STAThread]
        static public void Main(string[] args)
        {
            var ctx = new IronJS.Hosting.CSharp.Context();
    
            ctx.SetGlobal("clrprint",
                IronJS.Native.Utils.CreateFunction<Action<BoxedValue>>(ctx.Environment, 1, print));
            ctx.Execute("function print() { clrprint(arguments); }");
    
            ctx.Execute(@"print('Hello {0} {1}', 'world', 123);");
            Console.ReadKey(false);
        }
    }

    以上代码采用最新版的csscript测试通过,注意JS中只有double,没有int,在转int之前必须先转成double

  • 相关阅读:
    EFI下WIN8.1和Ubuntu的双系统安装
    硬盘损坏,全盘数据没了,杯具
    GEC2440的RTC时钟
    纠正一下apache2服务器的搭建
    qt和html的比较
    dump做个备份,发个随笔记录下
    忙了1天的qte-arm环境的搭建
    内核版本不同导致无法加载驱动
    wayne生产环境部署(360的容器发布平台-开源)
    openstack swift curl 常用操作
  • 原文地址:https://www.cnblogs.com/windtail/p/2924736.html
Copyright © 2011-2022 走看看