跳至頁尾內容
開發者更新

C# 屬性(對於開發者的運行原理)

在C#程式設計的世界中,元資料在豐富程式碼語義和行為方面發揮著至關重要的作用。 C# 屬性作為一種強大的工具,允許開發者將元資料附加到他們程式碼中的各種實體,從而改變編譯器、工具和運行環境解釋和互動這些實體的方式。

在這本綜合指南中,我們將了解C#屬性,探討它們的語法、應用及其如何作為增強程式碼表達力和功能的多用途機制。

理解C#屬性:初學者指南

屬性以方括號標註 ([]),是置於程式碼元素上方的聲明性標籤,為它們提供額外的資訊。 這些額外的資訊,也稱為元資料,不影響程式碼的核心功能,但為編譯器、運行環境和工具提供了寶貴的見解。

在C#中,物件屬性代表與程式實體(如類或方法)相關聯的元資料。 通過使用屬性語法定義的屬性實例增強了程式實體的描述,例如使用Conditional("DEBUG")有條件地包含程式碼。

以下是C#中使用屬性的基本範例:

[Serializable]
public class Person
{
    // Class Implementation
}
[Serializable]
public class Person
{
    // Class Implementation
}
<Serializable>
Public Class Person
	' Class Implementation
End Class
$vbLabelText   $csharpLabel

在此範例中,Person類的實例可以進行序列化。

C#屬性的型別

屬性應用於C#程式碼中的各種元素,包括:

  1. 程式集:應用於整個程式集,在編譯和執行過程中影響其行為。

    [assembly: AssemblyVersion("1.0.0.0")]
    [assembly: AssemblyVersion("1.0.0.0")]
    <Assembly: AssemblyVersion("1.0.0.0")>
    $vbLabelText   $csharpLabel
  2. 模組:應用於程式集中的模組,提供有關模組本身的資訊。

    [module: SomeCustomModuleAttribute]
    [module: SomeCustomModuleAttribute]
    <Module: SomeCustomModuleAttribute>
    $vbLabelText   $csharpLabel
  3. 型別:應用於型別,影響其行為或提供其他資訊。

    [Serializable]
    public class Person
    {
        // Class Implementation
    }
    [Serializable]
    public class Person
    {
        // Class Implementation
    }
    <Serializable>
    Public Class Person
    	' Class Implementation
    End Class
    $vbLabelText   $csharpLabel
  4. 方法:應用於方法,改變其行為或向工具提供資訊。

    [Obsolete("Use the newMethod instead.")]
    public void DeprecatedMethod()
    {
        // Method implementation
    }
    [Obsolete("Use the newMethod instead.")]
    public void DeprecatedMethod()
    {
        // Method implementation
    }
    <Obsolete("Use the newMethod instead.")>
    Public Sub DeprecatedMethod()
    	' Method implementation
    End Sub
    $vbLabelText   $csharpLabel
  5. 屬性、字段、事件等:應用於型別中的特定成員,提供與這些成員相關的元資料。

    public class Example
    {
        [DefaultValue(42)]
        public int Answer { get; set; }
    }
    public class Example
    {
        [DefaultValue(42)]
        public int Answer { get; set; }
    }
    Public Class Example
    	<DefaultValue(42)>
    	Public Property Answer() As Integer
    End Class
    $vbLabelText   $csharpLabel

Creating Custom Attributes in C

雖然C#提供許多內建屬性,但開發者可以建立自定義屬性,以傳達有關其程式碼的具體資訊。 自定義屬性是通過建立一個從System.Attribute繼承的類來定義的:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
public class CustomAttribute : Attribute
{
    // Attribute Implementation
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
public class CustomAttribute : Attribute
{
    // Attribute Implementation
}
<AttributeUsage(AttributeTargets.Class Or AttributeTargets.Method, AllowMultiple := True)>
Public Class CustomAttribute
	Inherits Attribute

	' Attribute Implementation
End Class
$vbLabelText   $csharpLabel

在此範例中,AllowMultiple屬性指定是否允許在單個目標上有多個屬性實例。 建立自定義屬性類時,在類名中加入 "Attribute" 後綴,以區別於普通類。 屬性構造函式初始化這些屬性,而位置參數在向這些屬性傳遞值時發揮作用,從而在程式碼中提供結構化的資訊。

C#屬性的應用

1. 程式碼文件

屬性在記錄程式碼和向開發者或工具提供附加資訊方面發揮著關鍵作用。 例如,[Obsolete]屬性指示某個特定元素不應再使用,開發者應遷移到其他替代品。

[Obsolete("This method is obsolete. Use the newMethod instead.")]
public void DeprecatedMethod()
{
    // Method Implementation
}
[Obsolete("This method is obsolete. Use the newMethod instead.")]
public void DeprecatedMethod()
{
    // Method Implementation
}
<Obsolete("This method is obsolete. Use the newMethod instead.")>
Public Sub DeprecatedMethod()
	' Method Implementation
End Sub
$vbLabelText   $csharpLabel

2. 序列化和持久化

[Serializable]這樣的屬性通知運行環境,型別的實例可以進行序列化。 這在處理資料持久化等場景時至關重要。

[Serializable]
public class Person
{
    // Class implementation
}
[Serializable]
public class Person
{
    // Class implementation
}
<Serializable>
Public Class Person
	' Class implementation
End Class
$vbLabelText   $csharpLabel

3. 程式碼分析和工具整合

屬性對靜態分析和程式碼生成工具有貢獻。 例如,像單元測試框架這樣的工具使用TestMethod等屬性來識別測試方法。

[TestClass]
public class MyTestClass
{
    [TestMethod]
    public void TestMethod()
    {
        // Test method implementation
    }
}
[TestClass]
public class MyTestClass
{
    [TestMethod]
    public void TestMethod()
    {
        // Test method implementation
    }
}
<TestClass>
Public Class MyTestClass
	<TestMethod>
	Public Sub TestMethod()
		' Test method implementation
	End Sub
End Class
$vbLabelText   $csharpLabel

4. ASP.NET MVC 路由

在ASP.NET MVC中,屬性廣泛用於路由。 Route屬性允許開發者為動作方法指定路由模板。

[Route("api/[controller]")]
public class SampleController : Controller
{
    [HttpGet]
    [Route("GetSampleData")]
    public IActionResult GetSampleData()
    {
        // Action method implementation
    }
}
[Route("api/[controller]")]
public class SampleController : Controller
{
    [HttpGet]
    [Route("GetSampleData")]
    public IActionResult GetSampleData()
    {
        // Action method implementation
    }
}
<Route("api/[controller]")>
Public Class SampleController
	Inherits Controller

	<HttpGet>
	<Route("GetSampleData")>
	Public Function GetSampleData() As IActionResult
		' Action method implementation
	End Function
End Class
$vbLabelText   $csharpLabel

介紹IronPDF:簡介

IronPDF概述作為一個多用途程式庫為C# .NET Framework開發者量身打造,提供了一整套PDF生成和操作的工具。 從從HTML建立PDF到從現有文件中提取內容,IronPDF簡化了複雜的任務,使其成為開發者工具箱中寶貴的資產。

C#屬性(對開發者的工作原理):圖1 - IronPDF網頁

安裝IronPDF:快速開始

要在您的C#項目中開始使用IronPDF程式庫,您可以輕鬆地安裝IronPDF的NuGet包。 在您的套件管理器控制台中使用以下命令:

Install-Package IronPdf

或者,您可以在NuGet套件管理器中搜尋"IronPDF"並從那裡安裝。

C#屬性:快速概述

C#屬性是提供有關程式碼中實體(例如類、方法或屬性)附加資訊的聲明性標籤。 它們允許開發者附加元資料或定義行為,而不改變上面提到的程式碼核心功能。 隨著我們探討屬性與IronPDF的整合,我們將發現它們如何能夠促進更深入的PDF生成方法。

提升PDF生成與C#屬性

1. 自定義文件元資料

屬性可以用來豐富與PDF文件相關的元資料。 IronPDF允許開發者自定義元資料元素,例如標題、作者和主題。 通過使用屬性,您可以將這些資訊動態注入到生成的PDF中。 以下範例展示了如何使用不同的屬性類與IronPDF:

// Define the DocumentMetadataAttribute
public class DocumentMetadataAttribute : Attribute
{
    public string Title { get; set; }
    public string Author { get; set; }
    public string Subject { get; set; }
}

[DocumentMetadata(Title = "Custom PDF Title", Author = "John Doe", Subject = "Document Subject")]
public class PdfGenerationWithAttributes
{
    public void GeneratePdf()
    {
        // Instantiate IronPDF PdfDocument
        var pdfDocument = new PdfDocument("StyledDocument.pdf");
        // Retrieve DocumentMetadataAttribute using reflection
        var documentMetadata = typeof(PdfGenerationWithAttributes)
            .GetCustomAttributes(typeof(DocumentMetadataAttribute), false)
            .FirstOrDefault() as DocumentMetadataAttribute;
        // Set metadata values
        pdfDocument.MetaData.Title = documentMetadata?.Title;
        pdfDocument.MetaData.Author = documentMetadata?.Author;
        pdfDocument.MetaData.Subject = documentMetadata?.Subject;
        // Perform document generation
        pdfDocument.SaveAs("CustomizedDocument.pdf");
    }
}

// Usage
PdfGenerationWithAttributes obj = new PdfGenerationWithAttributes();
obj.GeneratePdf();
// Define the DocumentMetadataAttribute
public class DocumentMetadataAttribute : Attribute
{
    public string Title { get; set; }
    public string Author { get; set; }
    public string Subject { get; set; }
}

[DocumentMetadata(Title = "Custom PDF Title", Author = "John Doe", Subject = "Document Subject")]
public class PdfGenerationWithAttributes
{
    public void GeneratePdf()
    {
        // Instantiate IronPDF PdfDocument
        var pdfDocument = new PdfDocument("StyledDocument.pdf");
        // Retrieve DocumentMetadataAttribute using reflection
        var documentMetadata = typeof(PdfGenerationWithAttributes)
            .GetCustomAttributes(typeof(DocumentMetadataAttribute), false)
            .FirstOrDefault() as DocumentMetadataAttribute;
        // Set metadata values
        pdfDocument.MetaData.Title = documentMetadata?.Title;
        pdfDocument.MetaData.Author = documentMetadata?.Author;
        pdfDocument.MetaData.Subject = documentMetadata?.Subject;
        // Perform document generation
        pdfDocument.SaveAs("CustomizedDocument.pdf");
    }
}

// Usage
PdfGenerationWithAttributes obj = new PdfGenerationWithAttributes();
obj.GeneratePdf();
' Define the DocumentMetadataAttribute
Public Class DocumentMetadataAttribute
	Inherits Attribute

	Public Property Title() As String
	Public Property Author() As String
	Public Property Subject() As String
End Class

<DocumentMetadata(Title := "Custom PDF Title", Author := "John Doe", Subject := "Document Subject")>
Public Class PdfGenerationWithAttributes
	Public Sub GeneratePdf()
		' Instantiate IronPDF PdfDocument
		Dim pdfDocument As New PdfDocument("StyledDocument.pdf")
		' Retrieve DocumentMetadataAttribute using reflection
		Dim documentMetadata = TryCast(GetType(PdfGenerationWithAttributes).GetCustomAttributes(GetType(DocumentMetadataAttribute), False).FirstOrDefault(), DocumentMetadataAttribute)
		' Set metadata values
		pdfDocument.MetaData.Title = documentMetadata?.Title
		pdfDocument.MetaData.Author = documentMetadata?.Author
		pdfDocument.MetaData.Subject = documentMetadata?.Subject
		' Perform document generation
		pdfDocument.SaveAs("CustomizedDocument.pdf")
	End Sub
End Class

' Usage
Private obj As New PdfGenerationWithAttributes()
obj.GeneratePdf()
$vbLabelText   $csharpLabel

在此範例中,DocumentMetadataAttribute作為一個自定義屬性,用於傳達元資料資訊,允許在PDF生成過程中進行動態自定義。 提供的程式碼在C#中定義了一個名為DocumentMetadataAttribute的自定義屬性類。 屬性是一種為類/方法/屬性等程式實體新增元資料或聲明性資訊的方法。 然後使用這些屬性通過反射來編輯PDF文件的MetaData

C#屬性(對開發者的工作原理):圖2 - 通過

2. 用屬性控制PDF佈局

屬性還可以用於控制PDF文件的佈局。 IronPDF提供設置頁面大小、邊距和方向的選項。 通過使用屬性,您可以根據具體需求參數化這些佈局設置:

// Define the PageLayoutAttribute
public class PageLayoutAttribute : Attribute
{
    public IronPdf.Rendering.PdfPaperSize Size { get; set; }
    public int MarginTop { get; set; }
    public int MarginBottom { get; set; }
    public int MarginLeft { get; set; }
    public int MarginRight { get; set; }
}

[PageLayout(Size = IronPdf.Rendering.PdfPaperSize.A4, MarginTop = 20, MarginBottom = 20, MarginLeft = 10, MarginRight = 10)]
public class PdfGenerationWithLayoutAttributes
{
    public void GeneratePdf()
    {
        // Instantiate IronPDF PdfDocument
        var pdfDocument = new ChromePdfRenderer();
        // Retrieve PageLayoutAttribute using reflection
        var pageLayout = typeof(PdfGenerationWithLayoutAttributes)
            .GetCustomAttributes(typeof(PageLayoutAttribute), false)
            .FirstOrDefault() as PageLayoutAttribute;
        // Set layout values
        pdfDocument.RenderingOptions.PaperSize = pageLayout?.Size;
        pdfDocument.RenderingOptions.MarginTop = pageLayout?.MarginTop ?? 0;
        pdfDocument.RenderingOptions.MarginBottom = pageLayout?.MarginBottom ?? 0;
        pdfDocument.RenderingOptions.MarginLeft = pageLayout?.MarginLeft ?? 0;
        pdfDocument.RenderingOptions.MarginRight = pageLayout?.MarginRight ?? 0;
        // Perform document generation
        pdfDocument.RenderHtmlAsPdf("<html><body><h1>Hello, IronPDF!</h1></body></html>")
            .SaveAs("CustomLayoutDocument.pdf");
    }
}

// Usage
PdfGenerationWithLayoutAttributes obj = new PdfGenerationWithLayoutAttributes();
obj.GeneratePdf();
// Define the PageLayoutAttribute
public class PageLayoutAttribute : Attribute
{
    public IronPdf.Rendering.PdfPaperSize Size { get; set; }
    public int MarginTop { get; set; }
    public int MarginBottom { get; set; }
    public int MarginLeft { get; set; }
    public int MarginRight { get; set; }
}

[PageLayout(Size = IronPdf.Rendering.PdfPaperSize.A4, MarginTop = 20, MarginBottom = 20, MarginLeft = 10, MarginRight = 10)]
public class PdfGenerationWithLayoutAttributes
{
    public void GeneratePdf()
    {
        // Instantiate IronPDF PdfDocument
        var pdfDocument = new ChromePdfRenderer();
        // Retrieve PageLayoutAttribute using reflection
        var pageLayout = typeof(PdfGenerationWithLayoutAttributes)
            .GetCustomAttributes(typeof(PageLayoutAttribute), false)
            .FirstOrDefault() as PageLayoutAttribute;
        // Set layout values
        pdfDocument.RenderingOptions.PaperSize = pageLayout?.Size;
        pdfDocument.RenderingOptions.MarginTop = pageLayout?.MarginTop ?? 0;
        pdfDocument.RenderingOptions.MarginBottom = pageLayout?.MarginBottom ?? 0;
        pdfDocument.RenderingOptions.MarginLeft = pageLayout?.MarginLeft ?? 0;
        pdfDocument.RenderingOptions.MarginRight = pageLayout?.MarginRight ?? 0;
        // Perform document generation
        pdfDocument.RenderHtmlAsPdf("<html><body><h1>Hello, IronPDF!</h1></body></html>")
            .SaveAs("CustomLayoutDocument.pdf");
    }
}

// Usage
PdfGenerationWithLayoutAttributes obj = new PdfGenerationWithLayoutAttributes();
obj.GeneratePdf();
' Define the PageLayoutAttribute
Public Class PageLayoutAttribute
	Inherits Attribute

	Public Property Size() As IronPdf.Rendering.PdfPaperSize
	Public Property MarginTop() As Integer
	Public Property MarginBottom() As Integer
	Public Property MarginLeft() As Integer
	Public Property MarginRight() As Integer
End Class

<PageLayout(Size := IronPdf.Rendering.PdfPaperSize.A4, MarginTop := 20, MarginBottom := 20, MarginLeft := 10, MarginRight := 10)>
Public Class PdfGenerationWithLayoutAttributes
	Public Sub GeneratePdf()
		' Instantiate IronPDF PdfDocument
		Dim pdfDocument = New ChromePdfRenderer()
		' Retrieve PageLayoutAttribute using reflection
		Dim pageLayout = TryCast(GetType(PdfGenerationWithLayoutAttributes).GetCustomAttributes(GetType(PageLayoutAttribute), False).FirstOrDefault(), PageLayoutAttribute)
		' Set layout values
		pdfDocument.RenderingOptions.PaperSize = pageLayout?.Size
		pdfDocument.RenderingOptions.MarginTop = If(pageLayout?.MarginTop, 0)
		pdfDocument.RenderingOptions.MarginBottom = If(pageLayout?.MarginBottom, 0)
		pdfDocument.RenderingOptions.MarginLeft = If(pageLayout?.MarginLeft, 0)
		pdfDocument.RenderingOptions.MarginRight = If(pageLayout?.MarginRight, 0)
		' Perform document generation
		pdfDocument.RenderHtmlAsPdf("<html><body><h1>Hello, IronPDF!</h1></body></html>").SaveAs("CustomLayoutDocument.pdf")
	End Sub
End Class

' Usage
Private obj As New PdfGenerationWithLayoutAttributes()
obj.GeneratePdf()
$vbLabelText   $csharpLabel

在此範例中,PageLayoutAttribute被用來封裝頁面佈局設置,允許根據屬性值進行動態調整。

結論

總而言之,C#屬性作為嵌入元資料到程式碼中的寶貴機制,影響工具、編譯器和運行環境解釋和處理該程式碼的方式。 無論是利用內建屬性還是建立自定義屬性,開發者都可以利用屬性來增強程式碼的表達性,實現工具整合,並塑造應用程式的行為。

C#屬性和IronPDF的整合為更細緻和動態的PDF生成開闢了途徑。 無論是自定義元資料還是調整佈局設置,屬性都提供了一種宣告性的方式來增強IronPDF的功能。 在探索可能性時,考慮您的PDF生成任務的具體需求以及屬性如何能夠為IronPDF提供更量身定做和高效的過程做出貢獻。

IronPDF是一個免費開發的軟體,但有一些限制,您可以透過取得授權來完整測試IronPDF的功能來解鎖這些限制。

常見問題

什麼是C#屬性及其功能?

C#屬性是宣告性標籤,您可以使用它來將中繼資料附加到程式碼實體,例如類、方法和屬性。它們在不更改核心程式碼的情況下增強程式碼的表達性和功能性,為編譯器、運行時環境和工具提供額外的資訊。

如何在C#中建立自定義屬性?

要在C#中建立自定義屬性,您需要定義一個從System.Attribute擴展的類。您可以使用AttributeUsage屬性來指定目標元素,控制自定義屬性可以應用的位置。

屬性如何增強PDF生成?

屬性可以用來自定義PDF文件中的元資料,如標題和作者,並控制佈局設置,如頁面大小和邊距。像IronPDF這樣的庫利用屬性來實現動態和定製的PDF建立。

[Serializable]屬性在C#中用於什麼?

[Serializable]屬性用來表示類的實例可以被序列化。這對於資料持久性和流操作非常重要,允許物件轉換為易於儲存或傳輸的格式。

屬性如何在ASP.NET MVC中使用?

在ASP.NET MVC中,像[Route]這樣的屬性被用來定義控制器行動的URL路由模板。這有助於建立有組織且可讀的URL結構,增強應用程式的路由功能。

屬性在程式碼文件中扮演什麼角色?

像[Obsolete]這樣的屬性服務於文件目的,通過標記不應使用的元素,建議替代方案,並向開發者提供有關不推薦使用的程式碼的警告。

屬性如何協助單元測試?

單元測試框架中的屬性,例如[TestMethod],可以識別和執行測試方法。它們提供測試工具用來有效組織和運行測試的元資料。

自定義屬性的AllowMultiple屬性重要性是什麼?

自定義屬性的AllowMultiple屬性決定屬性的多個實例是否可以應用於單個程式元素,提供了中繼資料附加的靈活性。

屬性可以用於工具整合嗎?

是的,屬性通過提供工具可以處理的元資料來促進工具整合。這包括與序列化、路由和文件生成等任務的框架整合。

C#中的一些常見內建屬性是什麼?

C#中的常見內建屬性包括[Serializable]、[Obsolete]、[Conditional]和[TestMethod]。這些屬性服務於不同的目的,如序列化、棄用、條件編譯和標識測試方法。

Jacob Mellor,首席技術官 @ Team Iron
首席技術官

Jacob Mellor是Iron Software的首席技術官,一位在C# PDF技術上開創先河的遠見工程師。作為Iron Software核心程式碼庫的原開發者,他從創立以來就一直在塑造公司的產品架構,與首席執行官Cameron Rimington一起將公司轉變為服務於NASA、特斯拉和全球政府公司的50多名人員的公司。

Jacob擁有曼徹斯特大學的土木工程一等榮譽學士學位(BEng),於1998-2001年之間獲得。在1999年於倫敦創辦他的第一家軟體公司並於2005年建立了他的第一批.NET元組件後,他專注於解決Microsoft生態系統中的複雜問題。

他的旗艦IronPDF和Iron Suite .NET程式庫在全球獲得了超過3000萬次NuGet安裝依據,他的基礎程式碼基繼續支援著世界各地開發者使用的工具。擁有25年的商業經驗和41年的程式設計專業知識,他仍專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話