我目前向別人的代碼中添加了附加內容,並遇到了使用PdfSharp dll的PdfBuilder類。直到此時,該類在構造函數中採用了稱爲BoxRequest
的類型。像這樣:爲兩種完全不同的類型編寫泛型方法
public PdfDocument GenerateAddressLabelPdf(int id)
{
var box = _unitOfWork.BoxRepository.GetById(id);
var generator = new PdfBuilder(box);
return generator.BuildPdfDocument();
}
而且PdfBuilder
類看起來是這樣的:
public class PdfBuilder
{
private readonly BoxRequest _boxRequest;
public PdfBuilder(BoxRequest boxRequest)
{
_boxRequest = boxRequest;
}
public PdfDocument BuildPdfDocument()
{
PdfDocument pdfDocument = new PdfDocument();
PdfPage page = pdfDocument.AddPage();
page.Orientation = PageOrientation.Landscape;
XGraphics gfx = XGraphics.FromPdfPage(page);
XFont font = new XFont("Arial", 40, XFontStyle.Regular);
XTextFormatter tf = new XTextFormatter(gfx);
XRect rect = new XRect(0, (page.Height/4), page.Width, page.Height);
gfx.DrawRectangle(XBrushes.White, rect);
tf.Alignment = XParagraphAlignment.Center;
tf.DrawString(GetText(), font, XBrushes.Black, rect);
return pdfDocument;
}
private string GetText()
{
StringBuilder sb = new StringBuilder();
sb.AppendLine(_boxRequest.Name);
sb.AppendLine(_boxRequest.Department);
sb.AppendLine(_boxRequest.Location.LocationName);
return sb.ToString();
}
}
因此,大家可以看到在GetText
使用的屬性從FileRequest
類型採取。
我現在需要再次使用這個類,這次爲一個新類型,稱爲FileRequest
,只要我打電話給這個類,看到它只需要BoxRequest
我認爲這可能是一件好事,使通用。
到目前爲止,我已經改變了類,像這樣:
public class PdfBuilder<T>
{
private readonly T _pdfType;
public PdfBuilder(T t)
{
_pdfType = t;
}
//additional class stuff
}
但現在我爲我應該怎麼做GetText
方法一般有點困惑,因爲我需要使某些線路的每一個類型。
在這一點上,我想我可以將類型傳遞給GetText
,然後檢查類型並根據類型添加不同的行,但它看起來不再是通用的?
這不太可能需要泛型。您需要從BoxRequest和FileRequest或\中提取接口,併爲它們創建單獨的PdfBuilder類(從當然繼承)。 – Evk
也許你可以讓T成爲一個由所有具體對象實現的接口? –
如果所有不同的是'GetText'如何重寫'BoxRequest'和其他類'ToString'方法而不關心類型?你可以用'替換'GetText()'。 'input.ToString()'否則,將'GetText()'提取到一個接口並讓兩個類以合適的方式實現 – nozzleman