请为我讲解Csharp 的反射器如何创建和使用,并用代码举例说明
时间: 2024-02-24 15:54:43 浏览: 32
C#的反射器是一个强大的工具,可以动态地获取并操作程序集、类型、成员和对象,使得我们能够在运行时发现和使用程序中的类型和成员,而不需要在编译时知道它们的存在。
反射器的使用分为以下步骤:
1. 加载程序集:使用Assembly类加载程序集,可以从文件、流或字节数组中加载。
2. 获取类型:使用Type类获取程序集中的类型。如果知道类型的全名,可以使用Type.GetType方法,如果不知道可以使用Assembly.GetTypes方法获取程序集中的所有类型。
3. 获取成员:使用Type类的GetMembers、GetFields、GetProperties等方法获取类型中的成员。
4. 调用方法和访问属性:使用MethodInfo类的Invoke方法调用方法,使用PropertyInfo类的GetValue和SetValue方法访问属性。
下面是一个示例代码,演示如何使用反射器获取并调用程序集中的方法:
```csharp
using System;
using System.Reflection;
namespace ReflectionDemo
{
class Program
{
static void Main(string[] args)
{
Assembly assembly = Assembly.LoadFrom("MyLibrary.dll"); // 加载程序集
Type type = assembly.GetType("MyLibrary.MyClass"); // 获取类型
object obj = Activator.CreateInstance(type); // 创建对象
MethodInfo method = type.GetMethod("SayHello"); // 获取方法
method.Invoke(obj, null); // 调用方法
Console.ReadKey();
}
}
}
namespace MyLibrary
{
public class MyClass
{
public void SayHello()
{
Console.WriteLine("Hello, world!");
}
}
}
```
在这个例子中,我们首先使用Assembly类加载了一个名为MyLibrary.dll的程序集,然后使用GetType方法获取了其中的MyClass类型,接着使用Activator类创建了一个MyClass对象。最后,我们获取了MyClass中的SayHello方法,并使用Invoke方法调用了它。当程序运行时,控制台会输出“Hello, world!”这个字符串。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)