문제

이 질문에는 이미 답변이 있습니다.

예를 들어 정확한 멤버 경로에 대한 텍스트 설명이 있는 동안 런타임에 개체의 값을 평가해야 합니다. myobject.firstMember.secondMember[3].text
우리는 정규식을 사용하여 이 텍스트 문을 구문 분석한 다음 리플렉션을 사용하여 텍스트 값을 평가하려고 생각했지만 그렇게 하기 전에 C#이 어떤 종류의 기능을 지원하는지 궁금합니다. 평가 능력?그래서 우리는 스스로 파싱을 할 필요가 없습니다.Microsoft는 직접 실행 창이나 감시 창에서 이 작업을 어떻게 수행합니까?

정말 고마워요.

아디 바르다

도움이 되었습니까?

해결책

아마도 가장 쉬운 방법은 사용하는 것입니다 Databinder.eval System.web.ui에서 :

var foo = new Foo() { Bar = new Bar() { Value = "Value" } };
var value = DataBinder.Eval(foo, "Bar.Value");

다른 팁

오픈 소스 프로젝트를 작성했습니다. 역동적 인 익스프레스, C# 구문을 사용하여 작성된 텍스트 표현식을 대표 (또는 표현식 트리)로 변환 할 수 있습니다. 표현은 구문 분석되고 변형됩니다 표현 나무 컴파일 또는 반사를 사용하지 않고.

당신은 다음과 같은 것을 쓸 수 있습니다.

var interpreter = new Interpreter();
var result = interpreter.Eval("8 / 2 + 2");

또는

var interpreter = new Interpreter()
                .SetVariable("service", new ServiceExample());

string expression = "x > 4 ? service.SomeMethod() : service.AnotherMethod()";

Lambda parsedExpression = interpreter.Parse(expression, 
                        new Parameter("x", typeof(int)));

parsedExpression.Invoke(5);

저의 작품은 Scott Gu 기사를 기반으로합니다 http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-linq-dynamic-query-library.aspx .

앞으로 (5.0 기간)에 "서비스로서의 컴파일러"가이를 수행 할 수 있습니다. 실제로, 당신은 지금 "모노"로 이것을 많이 할 수 있습니다 ( csharprepl 그리고 mono.csharp - 그러나 로컬 변수 등을 Evaluate) - 그러나 현재 MS .NET 오퍼링에서는 이에 대한 지원이 없습니다.

지금은 데이터 바인딩 코드가 많은 일을해야 할 것입니다 ... ""와 같은 토큰으로 분할해야합니다. 반사를 사용하십시오. 엄격히 말하면, 바인딩 코드는 실제로 사용합니다 TypeDescriptor/PropertyDescriptor 직접적인 반사보다는 효과가 동일합니다.

다소 무거운 접근 방식이기는 하지만 C# CodeDom을 사용하여 해당 코드 줄만 있는 메서드가 포함된 새 어셈블리를 내보낼 수 있습니다.

이것은 다른 제안 중 일부보다 훨씬 더 무겁다는 점을 인정합니다. 그러나 반면에 C# 파서가 무거운 작업을 수행하도록 하므로 유효한 C#인 한 사용자가 던지는 모든 것을 처리할 수 있어야 합니다. .

해당 경로로 이동하는 경우 내보낸 어셈블리를 다시 언로드할 수 있는지 확인해야 하므로 AppDomain을 만들고 언로드해야 할 수도 있습니다.

위의 기술을 성공적으로 구현하고 사용했습니다.반면에 동적 방법 훨씬 더 가벼워질 것입니다.그러나 나는 그런 접근 방식을 시도해 본 적이 없기 때문에 C# 리터럴을 사용하여 DynamicMethod의 본문을 구현할 수 있는지 여부를 말할 수 없습니다.

실제로 Windows Workflow Foundation의 표현 평가 및 규칙 엔진 기능은 이와 같은 작업을 수행 할 수 있습니다. 보다 Windows Workflow Foundation Rules Engine 소개.

이러한 구성 요소에 대한 흥미로운 점 중 하나는 자체 응용 프로그램에서 설계 시간 구성 요소를 호스팅하여 자신의 커스텀 클래스의 맥락에서 작동하는 규칙 및/또는 표현을 설계 할 수 있도록 설계되었다는 것입니다. 예를 들어, "myobject"에 대한 표현식을 설계하라고 말하며, 텍스트 속성을 갖는 유형을 산출하는 인덱서를 가진 두 번째 멤버가있는 첫 번째 멤버가 있음을 알고 있습니다. 표현식과 규칙을 XML로 유지하고 런타임에 디자이너를 사용할 필요없이 런타임에 다시 읽을 수 있습니다.

특히, 참조하십시오 외부 규칙 세트 툴킷 샘플.

불행히도 C#에는 귀하가 요구하는 일을 정확하게 수행 할 기본 시설이 없습니다.

그러나 내 C# 평가 프로그램을 사용하면 C# 코드를 평가할 수 있습니다. 런타임에서 C# 코드를 평가할 수 있으며 다음과 같은 표현식을 포함하여 많은 C# 문을 지원합니다.myObject.FirstMember.secondMember [3] .Text". 실제로이 코드는 .NET 프로젝트 내에서 사용할 수 있지만 C# 구문을 사용하는 것으로 제한됩니다. 내 웹 사이트를 살펴보십시오. http://csharp-eval.com, 자세한 내용은.

항상 내 가벼운 C# 평가 프로그램을 시도 할 수 있습니다. C# 언어의 상당한 하위 집합을 동적 메소드에 컴파일합니다. 내 Github 저장소에 대한 자세한 내용 Davidwynne/Csharpeval

Afaik 그러한 내장 평가 기능은 없습니다. 당신은 Regex+Reflection Way를 가야합니다. 또한 Visual Studio도 똑같이하고 있다고 생각합니다.

여기에 동적으로 중첩 된 속성을 찾는 데 사용하는 비슷한 것이 있습니다. 인덱서 용 로직을 추가해야합니다 ... 그리고 약간의 추가 점검 ... 내 호출 방법에서 널/오류를 잡고 있습니다 ...

  public static object FindDottedProperty(this object input, string propertyName)
  {
    if (input == null)
      return null;

    if (string.IsNullOrEmpty(propertyName))
      return null;

    Queue props = new Queue(propertyName.Split('.'));
    if (props.Count == 0) return null;

    //start with input object and roll out property stack from there.
    object ret = input;
    while (props.Count > 0)
    {
      var prop = props.Dequeue();
      if (string.IsNullOrEmpty(prop)) return null;

      /*** ADD INDEXER LOGIC HERE ***/

      //get the property's value based on the current named item
      ret = ret.GetType().GetProperty(prop).GetValue(ret, null);

      if (null.Equals(ret)) return null;
    }

    //return looked up value
    return ret;
  }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top