【问题标题】:Jint. How to set property of class, or invoke method, of class?金特。如何设置类的属性或调用方法?
【发布时间】:2021-07-20 16:44:53
【问题描述】:

如何使用 Jint 设置 javascript 类实例的属性(或调用方法)?

例如如果我这样做:

var o = new Jint.Engine().Evaluate(@"
class MyClass {
  constructor() {
     this.myProperty = null;
  }
}

const o = new MyClass;
return o;
");

然后如何设置返回的o 对象的 myProperty 值?

这是使用 Jint v3。

【问题讨论】:

    标签: jint


    【解决方案1】:

    要访问从 Jint 返回的内容,您可以通过在其上调用 ToObject() 将其转换为对象并将其声明为动态的,以便您可以使用任意属性:

    dynamic o = new Jint.Engine().Evaluate(
    @"
    class MyClass {
      constructor() {
         this.myProperty = null;
      }
    }
    
    const o = new MyClass;
    return o;
    ").ToObject();
    
    Console.WriteLine(o?.GetType() ?? "<null>"); //System.Dynamic.ExpandoObject
    
    Console.WriteLine(o?.myProperty ?? "<null>"); //<null>
    
    o.myProperty = "why not this string";
    Console.WriteLine(o?.myProperty ?? "<null>"); //why not this string
    Console.WriteLine(o?.myProperty?.GetType() ?? "<null>"); //System.String
    
    o.myProperty = 99;
    Console.WriteLine(o?.myProperty ?? "<null>"); //99
    Console.WriteLine(o?.myProperty?.GetType() ?? "<null>"); //System.Int32
    

    现在 AFAIK 没有内置方法可以更改属性并继续在 Javascript 中使用它。我能想到的两个选择:

    1. 在 C# 中声明类并通过 SetValue() 将实例传递给 Jint。对对象实例的更改将在 Jint 中可用。

    2. 破解类似这样的东西来更改 Jint 中的任意内容:

    public static void SetProperty(this Jint.Engine engine, string propertyPath, object value)
    {
        string tempname = "super_unique_name_that_will_never_collide_with_anything";
        engine.SetValue(tempname, value);
        engine.Evaluate($@"{propertyPath} = {tempname}; delete globalThis.{tempname};");
    }
    

    【讨论】:

    • 所有显示的是在 .NET 端设置的任意属性。这些值实际上并未在 javascript 引擎环境中设置。 string myProperty = js.Evaluate("return o.myProperty").ToString(); Console.WriteLine(myProperty); // null.
    • 嗨,抱歉,我不确定这是否容易,但我已经用一种愚蠢的扩展方法更新了我的答案。
    猜你喜欢
    • 2018-05-12
    • 2021-09-30
    • 2010-10-20
    • 2018-06-21
    • 1970-01-01
    • 2011-02-18
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多