2011-09-27 4 views
2

HereExpression<Func<MyClass, bool>> 술어를 동적으로 만드는 방법을 설명하는 게시물입니다. 다음은 스 니펫입니다.Expression 클래스를 사용하여 LINQ 표현식을 생성 할 때 regexp로 검색

var param = Expression.Parameter(typeof(string), "p"); 
    var len = Expression.PropertyOrField(param, "SomeText"); 
    var body = Expression.Equal(
     len, Expression.Constant("Text")); 

    var lambda = Expression.Lambda<Func<string, bool>>(
     body, param); 

등식 대신 문자열에 regexp를 적용하려면 어떻게해야합니까? 가능성이 있습니까? 당신은 정규 표현식을 검사 테스트 메서드를 호출 Expression.Call(Type type, string methodName, Type[] typeArguments, params Expression[] arguments)을 사용할 수 있습니다

var param = Expression.Parameter(typeof(string), "p"); 
    var len = Expression.PropertyOrField(param, "SomeText"); 
    var body = Expression.Regexp(
     len, @"\D+"); 

    var lambda = Expression.Lambda<Func<string, bool>>(
     body, param); 

답변

1

: 같은 가능한 의사 코드가 될 것이다.

List<string> lista = new List<string>() { "aaaa", "aaabb", "aaacccc", "eee" }; 

     var param = Expression.Parameter(typeof(string), "s"); 
     var pattern = Expression.Constant("\\Aa"); 

     var test = Expression.Call(typeof(Regex), "IsMatch", null, param, pattern); 

     var lambda = Expression.Lambda<Func<string, bool>>(test, param); 

     IEnumerable<string> query = lista.Where(lambda.Compile()); 

     foreach (string s in query) 
     { 
      Console.WriteLine(s); 
     } 
+0

감사합니다. 코드 샘플이 있습니까? –

+0

내 편집 된 답변보기 –

+0

이 문자열의 출처는 "IsMatch"입니까? 다음과 같은 구조 VAR 데이터 = 새로운 목록 { 새의 TestClass {이름 = "VALVOLINE", 수량 = 3}, 새의 TestClass {이름 = "캐스트롤", 수량 = 3}, 새의 TestClass {이름이 있다고 가정 –

관련 문제