什么是 C# 中的反射?
反射是描述代码中类型、方法和字段的元数据的过程。命名空间系统。反射使您能够获得关于加载的程序集、其中的元素(如类、方法和值类型)的数据。系统的一些常用类。反思有:
| 班级 | 描述 | | 装配 | 描述一个程序集,它是公共语言运行时应用程序的可重用、可版本化且自我描述的构建块 | | AssemblyName | 用唯一的名称标识程序集 | | 建筑信息 | 描述类构造函数并提供对元数据的访问 | | 方法信息 | 描述类方法并提供对其元数据的访问 | | ParameterInfo | 描述方法的参数,并提供对其元数据的访问 | | 事件信息 | 描述事件信息并提供对其元数据的访问 | | PropertyInfo | 发现属性的属性并提供对属性元数据的访问 | | 会员信息 | 获取有关成员属性的信息,并提供对成员元数据的访问 |
注意:还有很多其他类,上表只给出了常用的信息。
现在让我们看一个例子来描述反射在 C# 中是如何工作的。
示例 1: 在下面给出的代码中,我们使用 typeof 方法将 t 类型加载为字符串。然后我们在 t 上应用反射来找到任何关于字符串类的信息,比如它的名称、全名、名称空间和 basetype。
// C# program to illustrate
// the use of Reflection
using System;
using System.Reflection;
namespace Reflection_Demo {
class Program {
// Main Method
static void Main(string[] args)
{
// Initialise t as typeof string
Type t = typeof(string);
// Use Reflection to find about
// any sort of data related to t
Console.WriteLine("Name : {0}", t.Name);
Console.WriteLine("Full Name : {0}", t.FullName);
Console.WriteLine("Namespace : {0}", t.Namespace);
Console.WriteLine("Base Type : {0}", t.BaseType);
}
}
}
输出:
Name : String
Full Name : System.String
Namespace : System
Base Type : System.Object
示例 2: 在这段代码中,我们使用反射来显示与程序相关的所有元数据,这些元数据包括类、这些类的方法以及与这些参数相关联的参数。
// C# program to illustrate
// the use of Reflection
using System;
using System.Reflection;
namespace Reflection_Metadata {
// Define a class Student
class Student {
// Properties definition
public int RollNo
{
get;
set;
}
public string Name
{
get;
set;
}
// No Argument Constructor
public Student()
{
RollNo = 0;
Name = string.Empty;
}
// Parameterised Constructor
public Student(int rno, string n)
{
RollNo = rno;
Name = n;
}
// Method to Display Student Data
public void displayData()
{
Console.WriteLine("Roll Number : {0}", RollNo);
Console.WriteLine("Name : {0}", Name);
}
}
class GFG {
// Main Method
static void Main(string[] args)
{
// Declare Instance of class Assembly
// Call the GetExecutingAssembly method
// to load the current assembly
Assembly executing = Assembly.GetExecutingAssembly();
// Array to store types of the assembly
Type[] types = executing.GetTypes();
foreach(var item in types)
{
// Display each type
Console.WriteLine("Class : {0}", item.Name);
// Array to store methods
MethodInfo[] methods = item.GetMethods();
foreach(var method in methods)
{
// Display each method
Console.WriteLine("--> Method : {0}", method.Name);
// Array to store parameters
ParameterInfo[] parameters = method.GetParameters();
foreach(var arg in parameters)
{
// Display each parameter
Console.WriteLine("----> Parameter : {0} Type : {1}",
arg.Name, arg.ParameterType);
}
}
}
}
}
}
输出:
Class : Student
--> Method : get_RollNo
--> Method : set_RollNo
----> Parameter : value Type : System.Int32
--> Method : get_Name
--> Method : set_Name
----> Parameter : value Type : System.String
--> Method : displayData
--> Method : ToString
--> Method : Equals
----> Parameter : obj Type : System.Object
--> Method : GetHashCode
--> Method : GetType
Class : Program
--> Method : ToString
--> Method : Equals
----> Parameter : obj Type : System.Object
--> Method : GetHashCode
--> Method : GetType
版权属于:月萌API www.moonapi.com,转载请注明出处