首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在带有Dictionary<string、object>的JINT中可以使用"javascript dot notation“吗?

在带有Dictionary<string、object>的JINT中可以使用"javascript dot notation“吗?
EN

Stack Overflow用户
提问于 2012-02-16 03:35:52
回答 1查看 1.2K关注 0票数 1

我有一组JavaScript命令,比如doc.page == 5,我正在使用JINT在我的C#应用程序中执行脚本。

但是,在我的C#代码中,doc是一个Dictionary<string, object>。因此,我不能以这种方式使用点符号。

我当前的解决方案效率非常低:我将doc转换为JSON字符串,并将其添加到脚本中。Dictionary非常大,所以这比执行简单的命令有更多的开销。下面是一些示例代码:

代码语言:javascript
复制
// Some example data:
var command = "doc.page < 5 || doc.tax < 10 || doc.efile";
var doc = new Dictionary<string, object>(){
    {"page", 5},
    {"tax", 10},
    {"efile", true},
    // ... etc ...
};

// Execute the command:

// Convert Dictionary to JSON:
var jsonDoc = new StringBuilder();
jsonDoc.Append("var doc = {");
var first = true;
foreach (var kv in doc) {
    if (!first) {
        jsonDoc.Append(",");
    }
    first = false;

    jsonDoc.AppendFormat("{0}: {1}", kv.Key, kv.Value);
}
jsonDoc.Append("};");

var je = new JintEngine();
je.Run(jsonDoc.ToString());

var result = je.Run(command);
return result;

有没有更有效的方法呢?

EN

回答 1

Stack Overflow用户

发布于 2012-02-16 03:40:10

也许您可以利用dynamic允许在字典中使用点符号语法。我还没有测试过JINT,但我认为它会起作用。

下面是一个基于DynamicObject封装字典的示例(忽略了一些类型安全,但您得到了大致的概念:-)。您应该能够将其调整为使用JINT。

代码语言:javascript
复制
void Main()
{
    var values = new Dictionary<string,object> { 
        { "x", 5 }, { "Foo", "Bar" }
    };

    dynamic expando = new ExpandoDictionary(values);

    // We can lookup members in the dictionary by using dot notation on the dynamic expando
    Console.WriteLine(expando.x);
    // And assign new "members"
    expando.y = 42;
    expando.Bar = DateTime.Now;
    // The value set is in the dictionary
    Console.WriteLine(values["Bar"]);
}

public class ExpandoDictionary : DynamicObject 
{
    private readonly Dictionary<string,object> inner;

    public ExpandoDictionary(Dictionary<string,object> inner)
    {
        this.inner = inner;
    }

    public override bool TrySetMember(SetMemberBinder binder, object value) 
    {
        inner[binder.Name] = value;
        return true;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object value) 
    {
        return inner.TryGetValue(binder.Name, out value);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9300041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档