2013-10-11 51 views
1

我有下面的代碼,我需要一些幫助修復請。我想要的是向此方法傳遞一個String Expression和一個String []參數,並將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)); 


    } 

AS是,表達很可能被應用,但來自每個操作返回的類型不是我期望的類型。不知道,因爲我運行它時遇到異常。

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

該錯誤消息我不斷收到說

System.Linq.Dynamic.ParseException發生 的HResult = -2146233088 消息=類型的表達式IProductDetail「預計 來源=動態 位置= 0 堆棧跟蹤:在System.Linq.Dynamic.ExpressionParser.Parse(類型與resultType)

所以,我希望得到任何幫助在固定的代碼,並解釋請問我做錯了什麼。提前致謝。

+0

你有什麼錯誤? – SLaks

+4

不要重新編譯列表中每個項目的表達式。 – SLaks

+0

如果您有返回類型,這更像是一個'Select'操作(映射),而不是'ForEach'。你的回報類型將基於你在表達式中傳遞的信息... –

回答

0

如果您直接從Xml讀取數據並將其傳遞給您的函數而無需修改,那麼您只傳遞一個參數。該值的數組是這樣的:

values[0] : "000000 D6" 

您可能需要在基於已知的分隔符,是不是可能存在的實際值,如管道,如XML來分割你的參數的值所以:"000000|D6"。然後,您可以使用split將其更改爲一組參數:var parms = string.Split(values, "|");。 (您可以使用空格字符這一點,但可能會導致以後根據您在該屬性的值分別爲更多的麻煩。)

所以,如果你只傳遞一個項目到您的values參數,那麼values[1]將是null(或更準確地說,不存在),並且這可能會導致您看到的異常。如果沒有看到代碼的其餘部分,很難知道實際發生了什麼,但希望這會指出您正確的方向。

+0

這似乎並不能解決問題。我認爲問題不在於解析字符串,而是將值賦給屬性,然後返回一個IProductDetail對象。 – Kobojunkie