gpt4 book ai didi

c# - 为两种完全不同的类型编写泛型方法

转载 作者:行者123 更新时间:2023-11-30 21:44:52 26 4
gpt4 key购买 nike

我目前正在向其他人的代码中添加内容,并且遇到了一个使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com