使用 Reflection,任何人都可以動態(tài)地確定程序的類型、方法、屬性、構(gòu)造函數(shù)和其他成員,而無需在編譯時了解它們。反射提供了一種以靈活方式與類型和對象交互的強大方法。您可以使用反射來獲取有關(guān)類型中定義的事件的信息,例如它們的名稱、事件處理程序和其他元數(shù)據(jù)。
C# 中的反射與示例
以下是 C# 中反射的一些常見用法:
檢查類型:
反射可用于在運行時獲取有關(guān)類型的信息,例如它們的屬性、方法、字段和特性。
在運行時創(chuàng)建實例:
您可以使用反射在運行時創(chuàng)建類型(屬性、方法、字段和特性)的實例,即使您在運行時只知道類型(屬性、方法、字段和屬性)名稱。
在運行時調(diào)用的方法和屬性:
反射可用于在運行時調(diào)用方法和屬性,這在編譯時不知道成員名稱時特別有用。
獲取和更改字段:
您可以使用反射在運行時獲取和更改對象的字段。
檢查屬性:
反射可用于檢查應(yīng)用于類型、字段、方法、屬性、構(gòu)造函數(shù)等的屬性,并可以根據(jù)它們應(yīng)用必要的操作。
C# 中的反射與示例
using System;
using System.Reflection;
public class FruitClass
{
public string fruitName { get; set; }
public void getFruitName()
{
Console.WriteLine("Name of Fruit is = " + fruitName);
}
}
class Program
{
public static void Main(string[] args)
{
// Get assembly dynamically
Type t = typeof(System.String);
Console.WriteLine(t.Assembly);
Console.WriteLine(t.FullName);
Console.WriteLine(t.BaseType);
Console.WriteLine(t.IsClass);
Console.WriteLine(t.IsEnum);
Console.WriteLine(t.IsInterface);
Console.WriteLine(t.Name);
Console.WriteLine(t.Namespace);
Console.WriteLine(t.Module);
// Get the type dynamically
Type fruitType = typeof(FruitClass);
// Create an instance of the type dynamically
object fruitInstance = Activator.CreateInstance(fruitType);
// Access a property dynamically
PropertyInfo propertyInfo = fruitType.GetProperty("fruitName");
propertyInfo.SetValue(fruitInstance, "Mango, Reflection");
// Invoke a method dynamically
MethodInfo methodInfo = fruitType.GetMethod("getFruitName");
methodInfo.Invoke(fruitInstance, null);
// Access the property value
string propertyValue = (string)propertyInfo.GetValue(fruitInstance);
Console.WriteLine("Property value: " + propertyValue);
}
}
輸出
System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
System.String
System.Object
True
False
False
String
System
System.Private.CoreLib.dll
Name of Fruit is = Mango, Reflection
Property value: Mango, Reflection
C# 中使用枚舉示例的反射
using System;
using System.Reflection;
public class EventExample
{
public event EventHandler FruitEvent;
public void OnMyEvent()
{
// Raise the event
FruitEvent .Invoke(this, EventArgs.Empty);
}
}
class Program
{
public static void Main(string[] args)
{
// Create an instance of the class
EventExample example = new EventExample();
// Get the type of the class
Type type = example.GetType();
// Get the events defined in the class
EventInfo[] events = type.GetEvents();
// Display information about each event
foreach (EventInfo evt in events)
{
Console.WriteLine($"Event Name: {evt.Name}");
// Display information about the event handler delegate type
Console.WriteLine($"Event Handler Type: {evt.EventHandlerType}");
}
}
}
輸出
Event Name: FruitEvent
Event Handler Type: System.EventHandlert
C# 中的反射與事件示例
using System;
using System.Reflection;
public enum FruitEnumName
{
Apple,
Banana,
Mango,
Grape,
Orange,
Cherry,
Kiwi
}
class Program
{
public static void Main(string[] args)
{
// Get assembly dynamically
Type enumType = typeof(FruitEnumName);
// Display the name of the enum
Console.WriteLine($"Enum Name: {enumType.Name}");
Console.WriteLine(enumType.IsEnum);
// Get enum values
Array enumValues = Enum.GetValues(enumType);
foreach (object value in enumValues)
{
// Display enum value name and underlying string value
Console.WriteLine($"Name: {Enum.GetName(enumType, value)}, Value: {(object)value}");
// Get the type dynamically
Type fruitEnumType = typeof(FruitEnumName);
// Create an instance of the type dynamically
object fruitEnumInstance = Activator.CreateInstance(fruitEnumType);
// Access a enum dynamically
string enumInstance = enumType.GetEnumName(fruitEnumInstance);
Console.WriteLine("Enum value: " + enumInstance);
}
}
}
輸出
Enum Name: FruitEnumName
True
Name: Apple, Value: Apple
Enum value: Apple
Name: Banana, Value: Banana
Enum value: Apple
Name: Mango, Value: Mango
Enum value: Apple
Name: Grape, Value: Grape
Enum value: Apple
Name: Orange, Value: Orange
Enum value: Apple
Name: Cherry, Value: Cherry
Enum value: Apple
Name: Kiwi, Value: Kiwi
Enum value: Apple
該文章在 2024/8/19 11:05:43 編輯過