Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以使用;“javascript点符号”;带着一本字典,神采奕奕<;字符串,对象>;_Javascript_C#_Jint - Fatal编程技术网

是否可以使用;“javascript点符号”;带着一本字典,神采奕奕<;字符串,对象>;

是否可以使用;“javascript点符号”;带着一本字典,神采奕奕<;字符串,对象>;,javascript,c#,jint,Javascript,C#,Jint,我有一组JavaScript命令,比如doc.page==5,我正在使用它在我的C#应用程序中执行脚本 然而,在我的C代码中,doc是一个字典。因此,我不能以这种方式使用点符号 我当前的解决方案效率极低:我将doc转换为JSON字符串,并将其添加到脚本中。字典非常大,因此这比执行简单命令的开销要大得多。下面是一些示例代码: // Some example data: var command = "doc.page < 5 || doc.tax < 10 || doc.efile";

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

然而,在我的C代码中,
doc
是一个
字典
。因此,我不能以这种方式使用点符号

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

// 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;
//一些示例数据:
var command=“doc.page<5 | | doc.tax<10 | | doc.efile”;
var doc=新字典(){
{“第页”,5},
{“税”,10},
{“efile”,真的},
//……等等。。。
};
//执行以下命令:
//将字典转换为JSON:
var jsonDoc=新的StringBuilder();
Append(“var doc={”);
var first=真;
foreach(文件中的var kv){
如果(!第一个){
jsonDoc.Append(“,”);
}
第一个=假;
jsonDoc.AppendFormat(“{0}:{1}”,千伏键,千伏值);
}
jsonDoc.Append(“};”);
var je=新金藤碱();
je.Run(jsonDoc.ToString());
var result=je.Run(命令);
返回结果;

有没有办法更有效地做到这一点

也许您可以利用
动态
将点符号语法引入字典。我还没有用JINT测试过,但我认为它会起作用

下面是一个基于
DynamicObject
包装字典的示例(忽略了一些类型安全性,但您得到了一个大致的想法:-))。你应该能够适应这项工作与金特

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);
    }
}
void Main()
{
var values=新字典{
{“x”,5},{“Foo”,“Bar”}
};
动态expando=新的ExpandoDictionary(值);
//我们可以在动态expando上使用点符号查找字典中的成员
控制台写入线(expando.x);
//并指派新的“成员”
expando.y=42;
expando.Bar=DateTime.Now;
//值集在字典中
Console.WriteLine(值[“Bar]”);
}
公共类ExpandoDictionary:DynamicObject
{
专用只读词典;
公共扩展词典(词典内部)
{
this.inner=内部;
}
public override bool TrySetMember(SetMemberBinder绑定器,对象值)
{
内部[binder.Name]=值;
返回true;
}
public override bool TryGetMember(GetMemberBinder绑定器,输出对象值)
{
返回inner.TryGetValue(binder.Name,out值);
}
}

也许您可以利用
动态
将点符号语法引入字典。我还没有用JINT测试过,但我认为它会起作用

下面是一个基于
DynamicObject
包装字典的示例(忽略了一些类型安全性,但您得到了一个大致的想法:-))。你应该能够适应这项工作与金特

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);
    }
}
void Main()
{
var values=新字典{
{“x”,5},{“Foo”,“Bar”}
};
动态expando=新的ExpandoDictionary(值);
//我们可以在动态expando上使用点符号查找字典中的成员
控制台写入线(expando.x);
//并指派新的“成员”
expando.y=42;
expando.Bar=DateTime.Now;
//值集在字典中
Console.WriteLine(值[“Bar]”);
}
公共类ExpandoDictionary:DynamicObject
{
专用只读词典;
公共扩展词典(词典内部)
{
this.inner=内部;
}
public override bool TrySetMember(SetMemberBinder绑定器,对象值)
{
内部[binder.Name]=值;
返回true;
}
public override bool TryGetMember(GetMemberBinder绑定器,输出对象值)
{
返回inner.TryGetValue(binder.Name,out值);
}
}

这是个好主意。。。
动态
能否以这种方式(通过
字典
)进行自定义查找?我认为
dynamic
使用反射来计算属性和方法,显然
Dictionary
键不是属性。@Scott,不是直接的,尽管
ExpandoObject
非常接近。我将尝试创建一个在
动态
中包装词典的示例。此外,这不会影响您答案的有效性,但我没有提到我正在使用.NET 3.5。如果您知道非动态解决方案,请随意添加另一个答案!如果您需要它来处理.NET3.5,那么使用JSON序列化方法可能不是一个坏主意。我现在想不出比这更好的了。好吧,我做了一些测试。JINT将
动态
视为与任何其他对象相同,因此它肯定不起作用(现在我想知道/希望JINT可能有一些可扩展的
JavaScriptObject
,它们有
TrySetMember
TryGetMember
方法——那将是完美的!这是一个好主意,
动态的
是否可以进行自定义查找(通过
字典
)这样?我认为
dynamic
使用反射来计算属性和方法,显然
Dictionary
键不是属性。@Scott,不是直接的,尽管
ExpandoObject
非常接近。我将尝试在
dynamic
中包装一个字典的示例。而且,这不会影响您的答案是正确的,但我没有提到我正在使用.NET 3.5。如果您知道一个非动态解决方案,请随意添加另一个答案!如果您需要它来使用.NET 3.5,使用JSON序列化方法可能不是一个坏主意。我现在想不出更好的方法。好的,我做了一些测试。JINT treats
动态的
与任何其他对象一样,因此它肯定不起作用。:(现在我想知道/希望JINT可能有一些可扩展的
JavaScriptObject
,它有
TrySetMember
TryGetMember
m