透かしなしで本番環境でテストしてください。
必要な場所で動作します。
30日間、完全に機能する製品をご利用いただけます。
数分で稼働させることができます。
製品トライアル期間中にサポートエンジニアリングチームへの完全アクセス
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<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
このクラスを使用するには、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")
このコードは、単一のクラス (Box
ジェネリックメソッドは、ジェネリッククラスと似ていますが、メソッドレベルで型パラメータを用いて定義されます。 これは、ジェネリッククラスであっても非ジェネリッククラスであっても、異なる型に対して動作できるメソッドを作成することが可能になります。
任意の型の配列内で2つの要素を交換するメソッドをご紹介します:
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
上記のメソッドの使用方法は次のとおりです:
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)
ジェネリックインタフェースおよびデリゲートは、あらゆる型に対応する契約およびコールバックメソッドを定義することを可能にします。 クラスやメソッドでジェネリックインターフェイスを実装したりジェネリックデリゲートを使用することで、柔軟性とコードの再利用性が向上します。
データアクセス操作のための一般的なリポジトリインターフェースは次のようになります:
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
このインターフェイスは、特定のデータ型を処理するために任意のクラスによって実装することができ、異なる型にわたって一貫したデータアクセスパターンを可能にします。
型安全なコールバックを定義するためにジェネリックデリゲートを使用できます。
public delegate void Action<T>(T item);
public delegate void Action<T>(T item);
Public Delegate Sub Action(Of T)(ByVal item As T)
一般的なコレクションクラスは、List
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")
組み込みの汎用型を使用するだけでなく、異なるデータ型に共通する操作をカプセル化するために、型固有の方法で処理する必要がある独自の型を作成することができます。 このアプローチは、さまざまなデータ型で使用されるライブラリ、フレームワーク、またはユーティリティの構築に特に有用です。
成功フラグとオプションのメッセージと共に操作結果をカプセル化する一般的な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
IronPDFは、.NET開発者がアプリケーション内でPDFドキュメントの作成、編集、および抽出を行うために設計された包括的なライブラリです。 IronPDF は、HTML から PDF を生成する、既存の PDF を編集する、PDF を画像に変換するなど、多くの機能を提供します。 IronPDF自体はジェネリックに基づいていませんが、C#環境でこのライブラリとやり取りする方法を理解することで、アプリケーションのドキュメント管理機能を大幅に向上させることができます。
ここでジェネリクスを使用するアイデアは、任意の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
では、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
最後に、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
この例は、C# ジェネリクスと IronPDF を統合する基本を示しており、PdfOptions
C#ジェネリクスは、高品質で再利用可能、かつ型安全なコードを開発するための強力なツールです。 汎用クラス、メソッド、インターフェイス、デリゲートを理解し、適用することで、より適応性が高く、保守が容易なコードを書くことができます。 ジェネリクスは、さまざまなデータ型でのコード再利用を可能にするだけでなく、コンパイル時の型チェックを保証することにより、実行時エラーを減少させ、全体的なコード品質を向上させます。 IronPDFは、PDFライブラリツールの無料トライアルを提供しており、費用は$749から始まります。