2010-04-09 53 views
0

我需要使用iTextSharp在PDF中設計一大堆不同的元素(閱讀:「單元格」)。標籤,標頭,子報頭,數目等現在,我使用的各細胞類型的三種不同的方法:如何使用委託來調用樣式化方法?

public static PdfPCell GetDefaultCell(string strText) 
    { 
     PdfPCell cell = new PdfPCell(new Phrase(strText, GetDefaultFont())); 
     cell.Border = 0; 
     return cell; 
    } 

public static PdfPCell GetDefaultCell(string strText, int iColspan) 
    { 
     PdfPCell cell = new PdfPCell(new Phrase(strText, GetDefaultFont())); 
     cell.Border = 0; 
     cell.Colspan = iColspan; 
     return cell; 
    } 

public static PdfPCell GetDefaultCell(string strText, int iColspan, int iAlign) 
    { 
     PdfPCell cell = new PdfPCell(new Phrase(strText, GetDefaultFont())); 
     cell.Border = 0; 
     cell.Colspan = iColspan; 
     cell.HorizontalAlignment = iAlign; 
     return cell; 
    } 

在哪裏「默認」取代有用於每個組的三個方法中的細胞類型。我不認爲這是規模。特別是如果我現在擁有超過20或30種類型。如果我想修改的不僅僅是colspan和horizo​​ntalalignment屬性,該怎麼辦? 我可以在這裏使用代表?我的方法調用唯一的區別是方法中的名稱和GetXFont()調用。

回答

1

你可以通過一個委託到返回字體的方法:

public static PdfPCell GetCell(string strText, Func<Font> fontCreator) 
{ 
    PdfPCell cell = new PdfPCell(new Phrase(strText, fontCreator())); 
    cell.Border = 0; 
    return cell; 
} 

var cell = GetCell("...",() => GetDefaultFont()); 

但是你爲什麼不乾脆直接通過字體的方法?

public static PdfPCell GetCell(string strText, Font font) 
{ 
    PdfPCell cell = new PdfPCell(new Phrase(strText, font)); 
    cell.Border = 0; 
    return cell; 
} 

var cell = GetCell("...", GetDefaultFont()); 
+0

我認爲我最大的問題是它需要完成的次數。 PDF格式非常龐大,並且將繼續增長,我試圖儘可能地減少樣式化這些單元格,同時仍然允許將來進行更改。這兩個都回答我的問題,但有什麼辦法可以滿足我的懶惰嗎? – 2010-04-09 14:21:02

+0

你能舉一個例子說明你想讓你的代碼看起來像嗎? IMO的第二個解決方案非常漂亮。 – dtb 2010-04-09 14:27:10

+0

同意。我認爲即時通過委託,所以我只需要在方法調用中更改一次字體,而不是潛在的數千次。 – 2010-04-09 14:33:00

0

你當然可以在你的情況下使用代表,但問題是它是否真的有必要。如果函數GetDefaultFont返回了您希望在單元格中使用的字體,則可以簡單地將該字體作爲另一個參數傳遞(即將其稱爲調用GetXXXCell方法的調用者的責任)。傳遞委託在這裏看起來像是一個不必要的抽象。