[英]Is it possible to use “javascript dot notation” in JINT with a Dictionary<string, object>
我有一組JavaScript命令,例如doc.page == 5
,並且我正在使用JINT在我的C#應用程序中執行腳本。
但是,在我的C#代碼中, doc
是Dictionary<string, object>
。 因此,我不能以這種方式使用點符號。
我當前的解決方案效率極低:我將doc
轉換為JSON字符串,然后將其添加到腳本中。 Dictionary
非常大,因此與執行簡單命令相比,其開銷更大。 這是一些示例代碼:
// 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;
有什么辦法可以更有效地做到這一點?
也許您可以利用dynamic
允許點表示法語法進入字典。 我尚未使用JINT進行測試,但我認為它可以工作。
這是一個包裝基於DynamicObject
的Dictionary的示例(某些類型的安全性已被忽略,但您可以理解:-)。 您應該能夠使其適應於JINT。
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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.