作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在向其他人的代码中添加内容,并且遇到了一个使用 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
,然后检查类型并根据类型附加不同的行,但它似乎不再是通用的了?
最佳答案
我不认为泛型是处理这个问题的最佳方式...
如果所有不同的是 GetText
解决这个问题的最简单(不是最好)的方法是覆盖 BoxRequest 和其他类的 ToString()
方法而不关心类型。
public class BoxRequest
{
// ...
public override string ToString()
{
StringBuilder sb = new StringBuilder();
sb.AppendLine(this.Name);
sb.AppendLine(this.Department);
sb.AppendLine(this.Location.LocationName);
return sb.ToString();
}
}
public class PdfBuilder
{
private readonly object request;
public PdfBuilder(object request)
{
this.request = request;
}
public PdfDocument BuildPdfDocument()
{
// ...
tf.DrawString(request.ToString(), font, XBrushes.Black, rect);
// ...
}
}
这样,您就可以使用该类来 PDF 任何对象。如果这对你来说是通用的(对我来说是),你可以为 ToString()
/GetText()
提取一个接口(interface)并让你的 PdfBuilder
使用它(在我看来这会更干净)。
public interface IPdfConvertible
{
public string GetText()
}
// same for FileRequest...
public class BoxRequest : IPdfConvertible
{
// ...
public string GetText()
{
StringBuilder sb = new StringBuilder();
sb.AppendLine(this.Name);
sb.AppendLine(this.Department);
sb.AppendLine(this.Location.LocationName);
return sb.ToString();
}
}
public class PdfBuilder
{
private readonly IPdfConvertible request;
public PdfBuilder(IPdfConvertible request)
{
this.request = request;
}
public PdfDocument BuildPdfDocument()
{
// ...
tf.DrawString(request.GetText(), font, XBrushes.Black, rect);
// ...
}
}
关于c# - 为两种完全不同的类型编写泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40588222/
我是一名优秀的程序员,十分优秀!