动态ForEach循环更新对象属性值

时间:2013-10-11 17:38:52

标签: c# linq lambda

我有以下代码,我需要一些帮助修复。我想要的是将String表达式和String []参数传递给此方法,并将表达式编译并应用于列表中的各个项目。

  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:在System.Linq.Dynamic.ExpressionParser.Parse(TypeTypeType)

所以,我很感激任何帮助修复代码,并解释我做错了。提前致谢。

1 个答案:

答案 0 :(得分:0)

如果您直接从Xml读取数据并将其传递给您的函数而不进行修改,那么您只需传递一个参数。 values数组看起来像这样:

values[0] : "000000 D6"

您可能需要根据不太可能作为实际值存在的已知分隔符(例如管道)在xml中拆分参数的值,如:"000000|D6"。然后,您可以使用split:var parms = string.Split(values, "|");将其更改为参数数组。 (你可以使用空格字符,但这可能会在以后导致更多麻烦,具体取决于您在此属性中的值。)

因此,如果您只将一个项目传入values参数,则values[1]将为null(或更准确地说,不存在),这可能造成你所看到的例外。在没有看到其余代码的情况下很难知道实际发生了什么,但希望这会指出你正确的方向。