2013-10-11 30 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