2012-02-15 1 views
1

doc.page == 5과 같은 JavaScript 명령 집합이 있고 JINT을 사용하여 C# 응용 프로그램 내에서 스크립트를 실행하고 있습니다.Dictionary <string, object>가있는 JINT에서 "javascript dot notation"을 사용할 수 있습니까

그러나 내 C# 코드에서 docDictionary<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; 

더 효율적으로 수행 할 수있는 방법이 있습니까?

답변

1

dynamic을 사용하여 점 표기법 구문을 사전에 허용 할 수 있습니다. JINT로 테스트하지는 않았지만 작동 할 것이라고 생각합니다.

다음은 DynamicObject을 기준으로 사전을 래핑하는 예제입니다 (일부 유형 안전은 무시되지만 일반적 아이디어는 다음과 같습니다 .-)). 당신은 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); 
    } 
} 
+0

'동적 인'사용자 정의 조회 ('사전'을 통해)를 이렇게 할 수 있습니까? 나는'동적'이 속성과 메소드를 평가하기 위해 리플렉션을 사용한다고 생각했으며,'Dictionary' 키는 속성이 아닙니다. –

+0

@Scott, 직접적으로는 아니지만, 'ExpandoObject'가 매우 가깝습니다. 나는 '동적 인'형태로 사전을 포장하는 예를 들어보기 위해 노력할 것이다. – driis

+0

또한이 질문에 대한 답변의 유효성에는 영향을 미치지 않지만 .NET 3.5에 대해서는 여기서 언급하지 않았습니다. 동적이지 않은 해결책을 알고 있다면 자유롭게 다른 대답을 추가하십시오! –