2013-01-25 34 views
0

我试图用如下反射填写PDF表单:使用反射来填写PDF形式 - iTextSharp的

// Get the form fields for this PDF and fill them in! 
var formFieldMap = GetFormFieldNames(pdfTemplate); 

    foreach (var fields in formFieldMap) 
     { 
     var fieldName = UppercaseFirst(fields.Key.Replace("pdf_", "")); 

     var proPertyValue = fosques.GetType().GetProperty(fieldName).GetValue(ques, null); 

      formFieldMap[fields.Key] = proPertyValue.ToString(); 

     } 

这工作得很好针对第一属性,但在第二次迭代它说Collection was modified; enumeration operation may not execute.

我应该创建另一个字段集合,还是可以避免这种情况?

+2

无论何时迭代某个集合,都不应该在该过程中更改该集合的结构(并且将新值分配给此类映射中的现有关键字正在改变结构)。因此,无论是首先创建一个有问题的集合的浅表副本,或收集您想要在另一个集合中所做的更改,并在完成原始集合的foreach循环后应用它们。 – mkl

+0

@mkl谢谢你的意思是浅拷贝? – Zaki

+0

集合的浅表副本创建一个新集合,其中包含与原始对象相同的对象。相反,深层复制会创建一个包含原始对象所包含对象(深层)副本的新集合。 – mkl

回答

0

您正在通过枚举内引用您正在枚举的列表。

你并不需要得到formFieldMapy[fields.Key]因为你已经可以访问它,所以你可以简单地做:

foreach (var fields in formFieldMap) 
{ 
    var fieldName = UppercaseFirst(fields.Key.Replace("pdf_", "")); 

    var proPertyValue = fosques.GetType().GetProperty(fieldName).GetValue(ques, null); 
    fields.Value = proPertyValue.ToString(); 
    //formFieldMap[fields.Key] = proPertyValue.ToString(); 
} 

以上做同样的事情,它只是不直接修改你是什么枚举。

+0

如果我这样做,我得到:不能隐式地将类型'字符串'转换为'System.Collections.Generic.KeyValuePair ' – Zaki

+0

@ Sam1那么在这种情况下,它永远不会工作,因为你需要调用'formFieldMap [fields.Key] .Value =“”''末尾的'.Value'。看我的编辑。 – LukeHennerley

+0

它仍然说价值没有一个setter – Zaki

1

您正在修改foreach循环内的formFieldMap,该循环是迭代的基础。这就是第二次停止迭代的原因。因此,您必须保留一个单独的变量来收集循环内的这些值,并在完成循环后将它追加到formFieldMap

+0

是啊我会创建另一个集合,并将字段映射到该字段并将其作为我的集合传递... + 1 – Zaki

+0

@ Sam1虽然这会起作用,但为什么要在内存中创建相同的实例什么时候没有需要?你可以在循环中获得所需的所有内容,正如我所说:) – LukeHennerley

+0

@LukeHennerley,但问题是我无法设置值,因为没有setter(请参阅注释) – Zaki