.NET 帮助

C# 泛型(开发者如何使用)

发布 2024年四月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#

这段代码说明了一个类(盒子)可适应存储不同类型的数据(int, 字符串)展示了泛型在代码重用和类型安全方面的强大功能。

实现通用方法

泛型方法与泛型类类似,但在方法级别使用类型参数进行定义。 这允许创建可对不同类型进行操作的方法,同时在非通用类或通用类中进行定义。

通用方法示例

下面的方法可以交换任意类型数组中的两个元素:

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.GenericSystem.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 库

IronPDFPDF 是一个综合库,专为 .NET 开发人员在其应用程序中创建、编辑和提取 PDF 文档而设计。 IronPDF 在以下方面提供帮助从 HTML 生成 PDF翻译的内容包括:编辑现有 PDF、将 PDF 转换为图像等。 虽然 IronPDF 本身并非基于泛型,但了解如何在 C# 环境中与该库进行交互,可以大大增强应用程序的文档管理能力。

代码示例:在 IronPDF 中使用虚拟关键字

这里使用泛型的目的是创建一个可重复使用的方法,可以从任何给定的 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#

现在,让我们创建一个静态方法,利用我们的 PdfOptions 使用 IronPDF 生成 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 文档。 在本例中,元数据属性可以是一个字符串,包含标题或您认为相关的任何其他信息。

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# Virtual 关键字(对开发者的作用)

准备开始了吗? 版本: 2024.12 刚刚发布

免费NuGet下载 总下载量: 11,781,565 查看许可证 >