2016-11-14 169 views
2

我目前向別人的代碼中添加了附加內容,並遇到了使用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,然後檢查類型並根據類型添加不同的行,但它看起來不再是通用的?

+1

這不太可能需要泛型。您需要從BoxRequest和FileRequest或\中提取接口,併爲它們創建單獨的PdfBuilder類(從當然繼承)。 – Evk

+1

也許你可以讓T成爲一個由所有具體對象實現的接口? –

+1

如果所有不同的是'GetText'如何重寫'BoxRequest'和其他類'ToString'方法而不關心類型?你可以用'替換'GetText()'。 'input.ToString()'否則,將'GetText()'提取到一個接口並讓兩個類以合適的方式實現 – nozzleman

回答

3

我不認爲仿製藥的處理這個問題的最好方式......

如果所有不同的是,多數民衆贊成在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(),並讓你的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);   

     // ... 
    } 
} 
+0

我個人贊成用'GetText()'方法聲明一個新的'IPdfPrintable'接口,以便:1)'PdfBuilder'需要該接口的對象(而不是任何對象)。 2)'ToString()'的衆所周知的含義是不變的。 –

+0

我只是編輯exaclty,D – nozzleman

+0

有道理,謝謝! – JsonStatham