如何使用委托来调用样式方法?

时间:2010-04-09 14:09:47

标签: c# pdf-generation delegates itextsharp styles

我需要使用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;
    }

其中“Default”替换为每组三种方法的单元格类型。我认为这不会扩大。特别是如果我最终得到超过现在的20或30种类型。如果我想修改的不仅仅是colspan和horizo​​ntalalignment属性,该怎么办? 我可以在这里使用代表吗?我的方法调用的唯一区别是名称和方法中的GetXFont()调用。

2 个答案:

答案 0 :(得分: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());

答案 1 :(得分:0)

你当然可以在你的情况下使用代表,但问题是它是否真的有必要。如果函数GetDefaultFont返回要在单元格中使用的字体,则可以简单地将此字体作为另一个参数传递(即将调用它的责任交给GetXXXCell方法的调用者)。在这里传递委托似乎是一种不必要的抽象。