2013-01-25 47 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