2013-10-11 3 views
1

아래 코드를 수정 해주십시오. 필자가 원하는 것은 String Expression과 String [] Parameter를이 메서드에 전달하고 Expression을 컴파일하여 목록의 개별 항목에 적용합니다.동적 ForEach 루프가 객체를 업데이트합니다. 속성 값

public static IEnumerable<T> ForEach<T>(this IList<T> source, string expression, params object[] values) 
    { 
     if (source == null) throw new ArgumentNullException("source"); 
     if (expression == null) throw new ArgumentNullException("expression"); 
     var enumerableList = source.AsEnumerable<T>(); 

     return (from T item in source 
      select (T) DynamicLambdaExpression.ParseLambda(item.GetType(), typeof(T), expression, values).Compile().DynamicInvoke(item)); 


    } 

마찬가지로 표현식이 적용되고있을 수도 있지만 각 작업에서 반환되는 형식은 예상 한 형식이 아닙니다. 내가 그것을 실행할 때 나는 예외를 얻었 기 때문에 확실하지 않다.

<IfTrue Expression="it.UID = @0 + it.index.ToString(@1)" Parameters="000000 D6"/> 

내가 점점 계속 오류 메시지가 System.Linq.Dynamic.ParseException가 발생

말한다 HRESULT = -2146233088 메시지 = 유형의 표현 'IProductDetail'예상 출처 = 동적 위치 = 0 StackTrace : at System.Linq.Dynamic.ExpressionParser.Parse (결과 형식 입력)

코드 수정에 대한 도움을 주시면 감사하겠습니다. 내가 뭘 잘못했는지. 미리 감사드립니다.

+0

어떤 오류가 발생하고 있습니까? – SLaks

+4

목록의 각 항목에 대해 식을 다시 컴파일하지 마십시오. – SLaks

+0

리턴 타입을 가지고 있다면 이것은'ForEach'보다'Select' 연산 (매핑)에 더 가깝습니다. 당신의 반환 유형은 당신이 표현식에 전달하는 것을 기반으로합니다 ... –

답변

0

Xml에서 직접 데이터를 읽고 수정하지 않고 함수로 전달하는 경우 하나의 매개 변수 만 전달합니다. 값 배열은 다음과 같을 것이다 :

values[0] : "000000 D6" 

당신은 같은 같은 파이프로, 실제 값으로 존재할 가능성이 없습니다 알려진 구분에 따라 XML에 매개 변수의 값을 분할해야 할 수도 있습니다 그래서 : "000000|D6". 그런 다음 split을 사용하여 매개 변수의 배열로 변경할 수 있습니다 : var parms = string.Split(values, "|");. (당신은 이의 공백 문자를 사용할 수 있지만, 나중에이 속성에있는 값에 따라에 더 많은 문제가 발생할 수 있습니다.)

당신은 단지 당신의 values 매개 변수에 하나 개의 항목을 전달하는 그렇다면

, values[1]null (더 정확하게는 존재하지 않음)이며, 이는보고있는 예외의 원인 일 수 있습니다. 코드의 나머지 부분을 보지 않고 실제로 어떤 일이 일어나고 있는지 알기는 어렵지만, 이것이 올바른 방향으로 당신을 안내 할 것입니다.

+0

문제가 해결되지 않는 것 같습니다.문제는 문자열을 분석하는 것이 아니라 속성에 값을 할당하고 나중에 IProductDetail 객체를 반환하는 것입니다. – Kobojunkie

관련 문제