是否可以使用;“javascript点符号”;带着一本字典,神采奕奕<;字符串,对象>;
我有一组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";
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