.NET 幫助

C# 泛型(适用于开发人员的运作方式)

發佈 2024年4月3日
分享:

C# 泛型引入了一種設計類別、方法、介面和委派的方法,其管理的資料類型可以作為參數來指定。 這個概念稱為泛型類型參數,允許創建靈活且可重複使用的代碼組件。 通过使用泛型,您可以最大化程式碼的重用性、類型安全性和性能。 例如,通用類別可以定義一次,但可使用各種數據類型進行實例化,提供靈活性和類型完整性。 在本文中,我們將學習 C# 泛型的基本知識以及IronPDF 庫的 PDF 操作功能.

泛型類別的基本知識

在 C# 中,泛型類是一個用於創建類的藍圖,該藍圖包含或操作其類型的佔位符。 此佔位符,通常以 T 表示,代表在類別實例化時指定的類型參數。 我們可以使用類型參數 T 創建泛型類別來處理各種資料類型。泛型類別特別適用於集合類型的類別,如列表、隊列和雜湊表,因為它們可以容納任何資料類型,同時確保類型安全並減少類型轉換的需求。

泛型類別的簡單範例

考慮一個名為 Box 的泛型類別,該類別旨在儲存任何類型的值:

public class Box<T>
{
    private T data;
    public Box(T data) { this.data = data; }
    public T Data { get { return data; } }
}
public class Box<T>
{
    private T data;
    public Box(T data) { this.data = data; }
    public T Data { get { return data; } }
}
Public Class Box(Of T)
'INSTANT VB NOTE: The field data was renamed since Visual Basic does not allow fields to have the same name as other class members:
	Private data_Conflict As T
	Public Sub New(ByVal data As T)
		Me.data_Conflict = data
	End Sub
	Public ReadOnly Property Data() As T
		Get
			Return data_Conflict
		End Get
	End Property
End Class
VB   C#

要使用這個類別,您需要建立一個實例並具體指定 T 的實際類型:

Box<int> integerBox = new Box<int>(123);
Box<string> stringBox = new Box<string>("Hello");
Box<int> integerBox = new Box<int>(123);
Box<string> stringBox = new Box<string>("Hello");
Dim integerBox As New Box(Of Integer)(123)
Dim stringBox As New Box(Of String)("Hello")
VB   C#

這段程式碼說明了一個單一類別如何()能適應存儲不同的數據類型(intstring)展示泛型在代碼重用和類型安全性方面的強大功能。

實作泛型方法

泛型方法類似於泛型類別,但在方法層級定義類型參數。 這允許在定義於非泛型類別或泛型類別中的不同類型上創建可以運行的方法。

泛型方法範例

這是一個交換任何類型陣列中兩個元素的方法:

public class Utility
{
    public static void Swap<T>(ref T lhs, ref T rhs)
    {
        T temp = lhs;
        lhs = rhs;
        rhs = temp;
    }
}
public class Utility
{
    public static void Swap<T>(ref T lhs, ref T rhs)
    {
        T temp = lhs;
        lhs = rhs;
        rhs = temp;
    }
}
Public Class Utility
	Public Shared Sub Swap(Of T)(ByRef lhs As T, ByRef rhs As T)
		Dim temp As T = lhs
		lhs = rhs
		rhs = temp
	End Sub
End Class
VB   C#

上述方法的使用方式如下:

int a = 1, b = 2;
Utility.Swap<int>(ref a, ref b);
string first = "world", second = "hello";
Utility.Swap(ref first, ref second);
int a = 1, b = 2;
Utility.Swap<int>(ref a, ref b);
string first = "world", second = "hello";
Utility.Swap(ref first, ref second);
Dim a As Integer = 1, b As Integer = 2
Utility.Swap(Of Integer)(a, b)
Dim first As String = "world", second As String = "hello"
Utility.Swap(first, second)
VB   C#

探索泛型介面和委託

泛型介面和委派可讓您定義可以與任何類型運作的合約和回呼方法。 在您的類別或方法中實現泛型介面或使用泛型委派可以增強靈活性和代碼重用性。

通用界面範例

一個用於數據訪問操作的通用存儲庫介面可能如下所示:

public interface IRepository<T>
{
    void Add(T item);
    T GetById(int id);
    IEnumerable<T> GetAll();
}
public interface IRepository<T>
{
    void Add(T item);
    T GetById(int id);
    IEnumerable<T> GetAll();
}
Public Interface IRepository(Of T)
	Sub Add(ByVal item As T)
	Function GetById(ByVal id As Integer) As T
	Function GetAll() As IEnumerable(Of T)
End Interface
VB   C#

此介面可由任何類別實現,以處理特定的資料類型,允許在不同類型之間使用一致的資料存取模式。

泛型委託範例

可以使用泛型委派來定義類型安全的回調:

public delegate void Action<T>(T item);
public delegate void Action<T>(T item);
Public Delegate Sub Action(Of T)(ByVal item As T)
VB   C#

使用泛型集合

通用集合類別,例如 List, 字典<TKey, TValue>,以及 System.Collections.Generic 命名空間中的其他內容,提供類型安全且高效的集合,用於存儲和操作任何特定類型的數據。 這些集合比起非泛型對應的版本更優越,因為它們消除了需要進行類型轉換的需求,並減少了運行時錯誤。

List<string> names = new List<string>();
names.Add("Alice");
names.Add("Bob");
Dictionary<int, string> keyValuePairs = new Dictionary<int, string>();
keyValuePairs.Add(1, "One");
keyValuePairs.Add(2, "Two");
List<string> names = new List<string>();
names.Add("Alice");
names.Add("Bob");
Dictionary<int, string> keyValuePairs = new Dictionary<int, string>();
keyValuePairs.Add(1, "One");
keyValuePairs.Add(2, "Two");
Dim names As New List(Of String)()
names.Add("Alice")
names.Add("Bob")
Dim keyValuePairs As New Dictionary(Of Integer, String)()
keyValuePairs.Add(1, "One")
keyValuePairs.Add(2, "Two")
VB   C#

建立自訂泛型類型

除了使用內建的泛型類型,您還可以創建自己的類型來封裝在不同數據類型之間共有但需要以類型特定方式處理的操作。 此方法特別適用於構建庫、框架或工具,這些將與各種數據類型一起使用。

自訂泛型類型範例

考慮一個通用的 Result 類別,它封裝了操作結果,以及一個成功標誌和可選的信息:

public class Result<T>
{
    public bool Success { get; private set; }
    public T Data { get; private set; }
    public string Message { get; private set; }
    public Result(bool success, T data, string message = "")
    {
        Success = success;
        Data = data;
        Message = message;
    }
}
public class Result<T>
{
    public bool Success { get; private set; }
    public T Data { get; private set; }
    public string Message { get; private set; }
    public Result(bool success, T data, string message = "")
    {
        Success = success;
        Data = data;
        Message = message;
    }
}
Public Class Result(Of T)
	Private privateSuccess As Boolean
	Public Property Success() As Boolean
		Get
			Return privateSuccess
		End Get
		Private Set(ByVal value As Boolean)
			privateSuccess = value
		End Set
	End Property
	Private privateData As T
	Public Property Data() As T
		Get
			Return privateData
		End Get
		Private Set(ByVal value As T)
			privateData = value
		End Set
	End Property
	Private privateMessage As String
	Public Property Message() As String
		Get
			Return privateMessage
		End Get
		Private Set(ByVal value As String)
			privateMessage = value
		End Set
	End Property
	Public Sub New(ByVal success As Boolean, ByVal data As T, Optional ByVal message As String = "")
		Me.Success = success
		Me.Data = data
		Me.Message = message
	End Sub
End Class
VB   C#

IronPDF:C# PDF 庫

IronPDF是一個為 .NET 開發者設計的綜合性庫,用於在其應用程式中創建、編輯和提取 PDF 文件。 IronPDF 有助於從 HTML 生成 PDF,編輯現有 PDF、將 PDF 轉換為圖像等許多功能。 雖然IronPDF本身不基於泛型,但了解如何在C#環境中與該庫互動可以大大提升您的應用程式文件管理能力。

程式碼範例:在 IronPDF 中使用 virtual 關鍵字

在此使用泛型的想法是創建一個可重用的方法,可以從任何給定的 HTML 字串生成 PDF。 此方法將是通用的,允許我們根據需要指定不同類型的元數據或配置。

首先,我們來定義一個簡單的泛型類,這個類將包含我們的 PDF 生成選項。 為了演示目的,這個類別將是基本的,但您可以擴展它以添加更多屬性以滿足您的需求。

public class PdfOptions<T>
{
    public T Metadata { get; set; }
    public string HtmlContent { get; set; }
}
public class PdfOptions<T>
{
    public T Metadata { get; set; }
    public string HtmlContent { get; set; }
}
Public Class PdfOptions(Of T)
	Public Property Metadata() As T
	Public Property HtmlContent() As String
End Class
VB   C#

現在,讓我們使用IronPDF和我們的PdfOptions來創建一個生成PDF的靜態方法。類別。 此方法將接收一個 PdfOptions 實例作為它的參數, 展示泛型的使用。

public static class PdfGenerator
{
    public static void GeneratePdf<T>(PdfOptions<T> options)
    {
        // Initialize the IronPDF HtmlToPdf renderer
        var renderer = new ChromePdfRenderer();
        // Optional: Apply any renderer options here. For example, setting the paper size.
        renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
        // Generate the PDF from HTML content
        var pdfDocument = renderer.RenderHtmlAsPdf(options.HtmlContent);
        // Optional: Here, you can use options.Metadata in some way, depending on your generic type T.
        // For simplicity, we're just printing the metadata to console if it's of type string.
        if (options.Metadata is string metadataString)
        {
            Console.WriteLine($"Metadata: {metadataString}");
        }
        // Save the PDF to a file
        var fileName = $"GeneratedPdf_{DateTime.Now.Ticks}.pdf";
        pdfDocument.SaveAs(fileName);
        Console.WriteLine($"PDF generated and saved as {fileName}");
    }
}
public static class PdfGenerator
{
    public static void GeneratePdf<T>(PdfOptions<T> options)
    {
        // Initialize the IronPDF HtmlToPdf renderer
        var renderer = new ChromePdfRenderer();
        // Optional: Apply any renderer options here. For example, setting the paper size.
        renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
        // Generate the PDF from HTML content
        var pdfDocument = renderer.RenderHtmlAsPdf(options.HtmlContent);
        // Optional: Here, you can use options.Metadata in some way, depending on your generic type T.
        // For simplicity, we're just printing the metadata to console if it's of type string.
        if (options.Metadata is string metadataString)
        {
            Console.WriteLine($"Metadata: {metadataString}");
        }
        // Save the PDF to a file
        var fileName = $"GeneratedPdf_{DateTime.Now.Ticks}.pdf";
        pdfDocument.SaveAs(fileName);
        Console.WriteLine($"PDF generated and saved as {fileName}");
    }
}
Public Module PdfGenerator
	Public Sub GeneratePdf(Of T)(ByVal options As PdfOptions(Of T))
		' Initialize the IronPDF HtmlToPdf renderer
		Dim renderer = New ChromePdfRenderer()
		' Optional: Apply any renderer options here. For example, setting the paper size.
		renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4
		' Generate the PDF from HTML content
		Dim pdfDocument = renderer.RenderHtmlAsPdf(options.HtmlContent)
		' Optional: Here, you can use options.Metadata in some way, depending on your generic type T.
		' For simplicity, we're just printing the metadata to console if it's of type string.
		Dim tempVar As Boolean = TypeOf options.Metadata Is String
		Dim metadataString As String = If(tempVar, CStr(options.Metadata), Nothing)
		If tempVar Then
			Console.WriteLine($"Metadata: {metadataString}")
		End If
		' Save the PDF to a file
		Dim fileName = $"GeneratedPdf_{DateTime.Now.Ticks}.pdf"
		pdfDocument.SaveAs(fileName)
		Console.WriteLine($"PDF generated and saved as {fileName}")
	End Sub
End Module
VB   C#

最後,讓我們使用 PdfGenerator 類別生成一個 PDF 文件。 在此範例中,Metadata屬性可以是一個包含標題或任何其他您認為相關資訊的字串。

class Program
{
    static void Main(string [] args)
    {
        License.LicenseKey = "License-Key";
        var options = new PdfOptions<string>
        {
            HtmlContent = "<h1>Hello, World!</h1><p>This is a test PDF document generated from HTML.</p>",
            Metadata = "Test PDF Title"
        };
        PdfGenerator.GeneratePdf(options);
    }
}
class Program
{
    static void Main(string [] args)
    {
        License.LicenseKey = "License-Key";
        var options = new PdfOptions<string>
        {
            HtmlContent = "<h1>Hello, World!</h1><p>This is a test PDF document generated from HTML.</p>",
            Metadata = "Test PDF Title"
        };
        PdfGenerator.GeneratePdf(options);
    }
}
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		License.LicenseKey = "License-Key"
		Dim options = New PdfOptions(Of String) With {
			.HtmlContent = "<h1>Hello, World!</h1><p>This is a test PDF document generated from HTML.</p>",
			.Metadata = "Test PDF Title"
		}
		PdfGenerator.GeneratePdf(options)
	End Sub
End Class
VB   C#

此範例說明了如何將 IronPDF 與 C# 泛型整合的基本原理,提供了一種靈活的方式從 HTML 內容生成 PDF,同時允許通過泛型 PdfOptions 自訂元數據或配置。** 類別。 您可以為您的應用程式添加更復雜的選項和渲染器配置,以擴展此功能。

C# 泛型(開發人員的使用方式):圖 1 - 使用泛型透過 IronPDF 從 HTML 字串建立 PDF 文件的範例程式碼輸出

結論

C# 泛型(開發人員如何使用):圖 2 - IronPDF 授權頁面

C# 泛型是一種開發高品質、可重用且類型安全程式碼的強大工具。 通過理解和應用通用類別、方法、介面和委派,您可以編寫更具適應性且更易於維護的程式碼。 泛型不僅允許在不同數據類型之間重複使用代碼,還確保編譯時的類型檢查,從而減少運行時錯誤並提高整體代碼質量。 IronPDF 提供一個其 PDF 庫工具的免費試用版,費用從 $749 起。

< 上一頁
C# String.Join(開發者如何使用)
下一個 >
C# 虛擬關鍵字(開發人員如何使用)

準備開始了嗎? 版本: 2024.12 剛剛發布

免費 NuGet 下載 總下載次數: 11,622,374 查看許可證 >