【问题标题】:DynamicObject and JintDynamicObject 和 Jint
【发布时间】:2011-04-11 19:14:45
【问题描述】:

我想使用 Jint 下的 DynamicObject 类,并且我已经构建了一个示例来执行此操作。第一个断言正确通过,但第二个断言失败。

有什么方法可以做到吗,或者你知道任何其他的 javascript 引擎可以做到吗?

public void Jtest()
{
    Jint.JintEngine engine = new JintEngine();

    dynamic subject = new MyDynamicObject();

    dynamic x = subject.myProp.otherProp;

    Assert.AreEqual(subject, x);

    engine.SetParameter("myClass", subject);

    object result = engine.Run(@"return myClass.myProp.otherProp;");

    // result is null here
    Assert.AreEqual(subject, result);
}

public class MyDynamicObject : System.Dynamic.DynamicObject
{
    public override bool TryGetMember(System.Dynamic.GetMemberBinder binder, out object result)
    {
        result = this;
        return true;
    }
}

【问题讨论】:

  • 为什么你期望@"return myClass.myProp.otherProp;"的结果是字符串"otherProp"? (而不是对象subject?)
  • @dtb 谢谢你,我已经修正了错字。
  • 那么,在调用engine.Run 之后,result 实际上包含什么?
  • 如果你这样做,例如engine.SetParameter("myClass", 42);engine.Run(@"return myClass;");,它是否有效?
  • 这是一个有趣的问题。你应该直接在jint论坛上提问,你会得到开发者的更多帮助:jint.codeplex.com/discussions

标签: c# javascript dynamic jint


【解决方案1】:

我认为答案在 jint 代码中。要查找属性,它是基于反射的。我不认为反射处理动态对象。也许应该修改代码以使用 lambda 表达式。但在这种情况下,它不再适用于 2.0。

首先,您应该尝试重写 GetDynamicMemberNames 方法。也许这将有助于反思以找到属性,因此是 Jint。

【讨论】:

  • 谢谢,覆盖 GetDynamicMemberNames 也不起作用。我会尝试从 jint 开发人员那里获得帮助。
  • Nicolas 是开发者之一 ;)
  • @nicolas penim,我也为这种行为苦苦挣扎。有什么办法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多