C# Generics(開発者向けの動作方法)
C# のジェネリックは、管理するデータの型をパラメーターとして指定できるクラス、メソッド、インターフェース、およびデリゲートを設計するための方法を導入します。 この概念は、ジェネリック型パラメーターとして知られており、柔軟で再利用可能なコードコンポーネントの作成を可能にします。 ジェネリックスを使用することで、コードの再利用性、型の安全性、およびパフォーマンスを最大化できます。 たとえば、ジェネリッククラスは一度定義され、さまざまなデータ型でインスタンス化されることができます。これにより、柔軟性と型の整合性が提供されます。 この記事では、C# ジェネリックの基本とPDF 操作のための IronPDF ライブラリ機能について学びます。
ジェネリッククラスの基本
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(Of T)
Private data As T
Public Sub New(data As T)
Me.data = data
End Sub
Public ReadOnly Property Data As T
Get
Return data
End Get
End Property
End ClassPublic Class Box(Of T)
Private data As T
Public Sub New(data As T)
Me.data = data
End Sub
Public ReadOnly Property Data As T
Get
Return data
End Get
End Property
End Classこのクラスを使用するには、 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")Dim integerBox As New Box(Of Integer)(123)
Dim stringBox As New Box(Of String)("Hello")このコードは、単一のクラス (Box) が異なるデータ型 (int, string) を格納するために適応できる方法を説明し、ジェネリックスのコード再利用と型の安全性の強力さを示しています。
ジェネリックメソッドの実装
ジェネリックメソッドは、型パラメーターをメソッドレベルで定義する点でジェネリッククラスに似ています。 これは、非ジェネリッククラスまたはジェネリッククラスで定義され、異なる型で操作するメソッドを作成することを可能にします。
ジェネリックメソッドの例
任意の型の配列内の2つの要素を交換するメソッドを以下に示します。
public class Utility
{
// Swaps two elements by reference using generics
public static void Swap<t>(ref T lhs, ref T rhs)
{
T temp = lhs; // Store lhs in a temporary variable
lhs = rhs; // Assign rhs to lhs
rhs = temp; // Assign temp (original lhs) to rhs
}
}public class Utility
{
// Swaps two elements by reference using generics
public static void Swap<t>(ref T lhs, ref T rhs)
{
T temp = lhs; // Store lhs in a temporary variable
lhs = rhs; // Assign rhs to lhs
rhs = temp; // Assign temp (original lhs) to rhs
}
}Public Class Utility
' Swaps two elements by reference using generics
Public Shared Sub Swap(Of T)(ByRef lhs As T, ByRef rhs As T)
Dim temp As T = lhs ' Store lhs in a temporary variable
lhs = rhs ' Assign rhs to lhs
rhs = temp ' Assign temp (original lhs) to rhs
End Sub
End ClassPublic Class Utility
' Swaps two elements by reference using generics
Public Shared Sub Swap(Of T)(ByRef lhs As T, ByRef rhs As T)
Dim temp As T = lhs ' Store lhs in a temporary variable
lhs = rhs ' Assign rhs to lhs
rhs = temp ' Assign temp (original lhs) to rhs
End Sub
End Class上記のメソッドの使用法は次のようになります。
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)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)ジェネリックインターフェースとデリゲートの探索
ジェネリックインターフェースとデリゲートは、任意の型で動作する契約やコールバックメソッドを定義することを可能にします。 ジェネリックインターフェースを実装したり、ジェネリックデリゲートをクラスやメソッドで使用したりすることで、柔軟性とコードの再利用性を向上させます。
ジェネリックインターフェースの例
データアクセス操作のためのジェネリックリポジトリインターフェイスは、次のようになるかもしれません。
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(item As T)
Function GetById(id As Integer) As T
Function GetAll() As IEnumerable(Of T)
End InterfacePublic Interface IRepository(Of T)
Sub Add(item As T)
Function GetById(id As Integer) As T
Function GetAll() As IEnumerable(Of T)
End Interfaceこのインターフェースは、特定のデータ型を扱うために任意のクラスで実装でき、異なるタイプにわたって一貫したデータアクセスパターンを可能にします。
ジェネリックデリゲートの例
ジェネリックデリゲートは、型安全のコールバックを定義するために使用できます。
public delegate void Action<t>(T item);public delegate void Action<t>(T item);Public Delegate Sub Action(Of T)(item As T)Public Delegate Sub Action(Of T)(item As T)ジェネリックコレクションの活用
ジェネリックコレクションクラス、たとえば List、Dictionary<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")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")カスタムジェネリックタイプの作成
組み込みのジェネリックタイプの使用を超えて、あなた自身のものを作成することで、異なるデータ型全体に共通するが型特有に扱う必要がある操作をカプセル化できます。 このアプローチは、異なるデータ型で使用されるライブラリ、フレームワーク、またはユーティリティを構築するために特に有用です。
カスタムジェネリックタイプの例
操作の結果と成功フラグおよびオプションのメッセージをカプセル化するジェネリック 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)
Public ReadOnly Property Success As Boolean
Public ReadOnly Property Data As T
Public ReadOnly Property Message As String
Public Sub New(success As Boolean, data As T, Optional message As String = "")
Me.Success = success
Me.Data = data
Me.Message = message
End Sub
End ClassPublic Class Result(Of T)
Public ReadOnly Property Success As Boolean
Public ReadOnly Property Data As T
Public ReadOnly Property Message As String
Public Sub New(success As Boolean, data As T, Optional message As String = "")
Me.Success = success
Me.Data = data
Me.Message = message
End Sub
End ClassIronPDF: C# PDFライブラリ
IronPDF は、.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 ClassPublic Class PdfOptions(Of T)
Public Property Metadata As T
Public Property HtmlContent As String
End Class次に、IronPDF を使用して PDF を生成するための静的メソッドを作成し、PdfOptions クラスを活用します。 このメソッドは、パラメーターとして PdfOptions のインスタンスを受け取り、ジェネリックスの実際の使用を示します。
using IronPdf; // Make sure to include the necessary namespace for IronPDF
public static class PdfGenerator
{
// Generates a PDF from provided HTML content and options
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}");
}
}using IronPdf; // Make sure to include the necessary namespace for IronPDF
public static class PdfGenerator
{
// Generates a PDF from provided HTML content and options
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}");
}
}Imports IronPdf ' Make sure to include the necessary namespace for IronPDF
Public Module PdfGenerator
' Generates a PDF from provided HTML content and options
Public Sub GeneratePdf(Of T)(options As PdfOptions(Of T))
' Initialize the IronPDF HtmlToPdf renderer
Dim renderer As 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
If TypeOf options.Metadata Is String Then
Dim metadataString As String = CType(options.Metadata, String)
Console.WriteLine($"Metadata: {metadataString}")
End If
' Save the PDF to a file
Dim fileName As String = $"GeneratedPdf_{DateTime.Now.Ticks}.pdf"
pdfDocument.SaveAs(fileName)
Console.WriteLine($"PDF generated and saved as {fileName}")
End Sub
End ModuleImports IronPdf ' Make sure to include the necessary namespace for IronPDF
Public Module PdfGenerator
' Generates a PDF from provided HTML content and options
Public Sub GeneratePdf(Of T)(options As PdfOptions(Of T))
' Initialize the IronPDF HtmlToPdf renderer
Dim renderer As 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
If TypeOf options.Metadata Is String Then
Dim metadataString As String = CType(options.Metadata, String)
Console.WriteLine($"Metadata: {metadataString}")
End If
' Save the PDF to a file
Dim fileName As String = $"GeneratedPdf_{DateTime.Now.Ticks}.pdf"
pdfDocument.SaveAs(fileName)
Console.WriteLine($"PDF generated and saved as {fileName}")
End Sub
End Module最後に、PdfGenerator クラスを使用して PDF ドキュメントを生成しましょう。 この例において、Metadata プロパティはタイトルや関連と思われるその他の情報を含む文字列となるかもしれません。
class Program
{
static void Main(string[] args)
{
// Set the license key for IronPDF if needed
License.LicenseKey = "Your-License-Key-Here";
// Create PDF options with HTML content and metadata
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"
};
// Generate the PDF using the specified options
PdfGenerator.GeneratePdf(options);
}
}class Program
{
static void Main(string[] args)
{
// Set the license key for IronPDF if needed
License.LicenseKey = "Your-License-Key-Here";
// Create PDF options with HTML content and metadata
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"
};
// Generate the PDF using the specified options
PdfGenerator.GeneratePdf(options);
}
}Friend Class Program
Shared Sub Main(ByVal args() As String)
' Set the license key for IronPDF if needed
License.LicenseKey = "Your-License-Key-Here"
' Create PDF options with HTML content and metadata
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"
}
' Generate the PDF using the specified options
PdfGenerator.GeneratePdf(options)
End Sub
End ClassFriend Class Program
Shared Sub Main(ByVal args() As String)
' Set the license key for IronPDF if needed
License.LicenseKey = "Your-License-Key-Here"
' Create PDF options with HTML content and metadata
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"
}
' Generate the PDF using the specified options
PdfGenerator.GeneratePdf(options)
End Sub
End Classこの例は、IronPDF を C# ジェネリンクスと統合し、HTML コンテンツから PDF を生成する柔軟な方法を提供し、ジェネリック PdfOptions クラスを通じてカスタマイズ可能なメタデータや設定を可能にしています。 これに関しては、アプリケーションに必要なより洗練されたオプションやレンダラー設定を追加することで拡張することができます。
C# ジェネリクス (開発者向け動作説明): 図1 - ジェネリクスを利用してIronPDFでHTML文字列からPDFドキュメントを作成するためのサンプルコード出力
結論
C# のジェネリックスは、高品質で再利用可能で型安全なコードを開発するための強力なツールです。 ジェネリッククラス、メソッド、インターフェース、およびデリゲートを理解し適用することで、より適応性があり、保守が容易なコードを記述できます。 ジェネリックスは、異なるデータタイプにわたるコードの再利用を可能にするだけでなく、コンパイル時の型チェックを保証し、実行時のエラーを減少させ、全体的なコードの品質を向上させます。 IronPDFはPDFライブラリツールの無料トライアルを提供しており、価格は$999からです。
ジェイコブ・メラーはIron Softwareの最高技術責任者(CTO)であり、C# PDFテクノロジーを開拓する先見的なエンジニアです。Iron Softwareのコアコードベースを支えるオリジナル開発者として、彼は創業以来、会社の製品アーキテクチャを形成し、CEOのCameron Rimingtonとともに、会社をNASA、Tesla、および世界的な政府機関にサービスを提供する50人以上の会社に変えました。1999年にロンドンで最初のソフトウェアビジネスを開業し、2005年に最初 for .NETコンポーネントを作成した後、Microsoftのエコシステム全体で複雑な問題を解決することを専門としました。