首頁  >  文章  >  後端開發  >  C# 中的反射

C# 中的反射

PHPz
PHPz原創
2024-09-03 15:19:12863瀏覽

C#中的反射是收集其特性資訊並對其自身進行操作的過程。收集的資訊包括物件的屬性、類型、事件、方法等;反射對於尋找所有類型的組件很有用。它動態地呼叫組裝方法,我們可以動態地將類型綁定到現有物件或從現有物件取得類型;反射用於建立該類型的實例。我們可以存取其屬性和字段,反射的主要目的是用於讀取其元資料以在運行時搜尋組件。

為什麼 C# 需要反射?

運行時我們需要C#中的反射來獲取類型資訊;它是觀察託管程式碼以讀取其元資料以在運行時查找模組和組件的過程。反射透過從程式集中提取元資料來反映程序,該元資料用於修改其行為。  系統。反射命名空間可讓您存取方法、載入類型和欄位的託管視圖,以動態建立和呼叫類型。我們要求對以下申請流程進行反思,

  • 在運行時過程中,反射允許查看屬性資訊。
  • 反射允許後期綁定屬性和方法
  • 它檢查幾種類型的程序集及其類型
  • 它允許在運行時建立新類型,並按照這些類型執行各種任務。

反射在 C# 中如何運作?

C# 反射使應用程式能夠自行獲取訊息,並且對自身進行操作。它有效地搜尋所有類型的程序集並動態呼叫程序集方法。

反射中使用的最重要的類別是 System.類型類別是一個抽象類,表示稱為 CTS(通用類型系統)的類型。使用此類,我們可以找到在命名空間模組中使用的類型,並驗證給定的類型是值類型還是引用類型。透過使用以下項目,我們可以解析元資料表,

  • 方法
  • 屬性
  • 活動
  • 田野

利用反射,實作了Late Binding;在編譯時,由於這些原因,我們可能不知道要載入哪個組件;我們透過要求使用者在執行時間執行時輸入組件名稱和類型來載入適當的組件。透過直接載入程序集,我們使用 System.反射。透過取得三個靜態類型進行組裝是,

  • 載入自
  • 載入模組
  • LoadWithPartialName

考慮到組件是 exe 或 dll 文件,使該文件成為通用類型系統的可移植可執行文件,其副檔名為 .dll 或 .exe。可移植的可執行檔是包含多個表格的元數據,如下所示,

  • 方法定義表
  • 型別定義表
  • 欄位定義表

C# 中的反射範例

下面給出了 C# 中反射的範例:

範例#1

using System;
using System.Reflection;
namespace Reflection_Sample {
class Program_1 {
// Main Method
static void Main(string[] args)
{
// to initialize _type as typeof string
Type _type = typeof(string);
// by using the Reflection to find and in any sort of data related to _type
Console.WriteLine("Name : {0}", _type.Name);
Console.WriteLine("Full Name : {0}", _type.FullName);
Console.WriteLine("Namespace : {0}", _type.Namespace);
Console.WriteLine("Base Type : {0}", _type.BaseType);
}
}
}

在上面的程式碼中,我們使用 typeof 方法將類型 _type 作為字串載入。然後我們關聯對 _type 的反射來獲取字串類別的信息,包括命名空間、名稱、全名和基本類型。

輸出:

C# 中的反射

範例#2

在這個程式中,我們透過定義typeof方法來取得程式集,並透過這種方式取得_type。集會。我們來看看範例程式

using System;
using System.Reflection;
public class ReflectionExample
{
public static void Main()
{
Type _type = typeof(System.String);
Console.WriteLine(_type.Assembly);
}
}

輸出:

C# 中的反射

範例 #3

在這個程式中,我們使用反射來顯示元資料;它包括方法、類別和各種參數化建構子。讓我們來看下面的例子,

using System;
using System.Reflection;
namespace Sample_ReflectionMetadata
{
// to define a class StudentDetails
class StudentDetails
{
// defining the Properties
public int _RollNo
{
get;
set;
}
public string _Name
{
get;
set;
}
// Constructor with no arguments
public StudentDetails()
{
_RollNo = 0;
_Name = string.Empty;
}
// this is a Parameterised Constructor with 2 parameters
public StudentDetails(int _Srollno, string _Sname)
{
_RollNo = _Srollno;
_Name = _Sname;
}
// to invoke method to Display Student Details
public void StudentDisplayData()
{
Console.WriteLine("Roll Number : {0}", _RollNo);
Console.WriteLine("Name : {0}", _Name);
}
}
class ReflectionClass
{
// Main Method
static void Main(string[] args)
{
// to declare Assembly and loading the current assembly
Assembly _executing = Assembly.GetExecutingAssembly();
Type[] _types = _executing.GetTypes();
foreach(var item in _types)
{
Console.WriteLine("Class : {0}", item.Name);
// storing the methods  in array
MethodInfo[] methods = item.GetMethods();
foreach(var method in methods)
{
// for displaying each method
Console.WriteLine("--> Method : {0}", method.Name);
// to store the parameters in array
ParameterInfo[] parameters = method.GetParameters();
foreach(var arg in parameters)
{
Console.WriteLine(" Parameter : {0} Type : {1}",
arg.Name, arg.ParameterType);
}
}
}
}
}
}

輸出:

C# 中的反射

範例#4

反思是動態觀察和改變其真實結構和行為的過程。在下面的範例程式中,反射的作用是我們可以在運行時分析和更改應用程式中的信息。  讓我們來看例子,

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace ReflectionSample
{
class Program
{
private static int value_1= 15, value_2 = 25, value_3 = 30;
static void Main(string[] args)
{
Console.WriteLine("The Values are = " + (value_1 + value_2 + value_3));
Console.WriteLine("Input the Name of variable to be altered:");
string _varName = Console.ReadLine();
Type _type = typeof(Program);
FieldInfo _fieldInfo = _type.GetField(_varName, BindingFlags.NonPublic | BindingFlags.Static);
if(_fieldInfo != null)
{
Console.WriteLine("The Latest Value of " + _fieldInfo.Name + " is " + _fieldInfo.GetValue(null) + ". Input NeW Value:");
string newValue = Console.ReadLine();
int newInt;
if(int.TryParse(newValue, out newInt))
{
_fieldInfo.SetValue(null, newInt);
Console.WriteLine(" Final Values are = " + (value_1 + value_2 + value_3));
}
Console.ReadKey();
}
}
}
}

在這裡,我們可以透過知道變數的名稱來在運行時更改變數的值。透過使用反射,我們可以實現這些類型的方法。讓我們看看下面的輸出,

輸出:

C# 中的反射

結論

希望您喜歡這篇文章;C# Reflection 涵蓋了 .Net 中的重要功能;我們透過幾個例子了解了反射在 C#.Net 中的工作原理。希望這篇文章能幫助您更理解。

以上是C# 中的反射的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:C# 參數下一篇:C# 參數