C#程序集和反射是C#语言中的重要概念,下面我将详细讲解它们。
C#程序集
程序集是 C# 语言的一个基本概念,它是一组可重用的代码和相关信息的集合。程序集是一种可以被其他程序重用的单元。在 Visual Studio 中,可以创建两种类型的程序集:可执行程序集和动态链接库。
在创建程序集的过程中,需要考虑程序集名称、程序集版本、程序集描述等信息。下面是创建一个动态链接库的示例:
// MyClassLibrary.cs
using System;
namespace MyClassLibrary
{
public class MyClass
{
public static void PrintMessage(string message)
{
Console.WriteLine(message);
}
}
}
// MyClassLibrary.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>
</Project>
编译以上代码,生成的 MyClassLibrary.dll 就是一个动态链接库程序集。我们可以在其他C#应用程序中引用该程序集,以便使用 MyClass 类。当使用 MyClass 类时,应注意在程序中添加如下引用语句:
using MyClassLibrary;
反射
反射是指 .NET 程序在运行时可以动态地获取程序集信息,并在运行时动态创建类型、调用方法等。在 C# 语言中,可以通过 System.Reflection 命名空间中的类来实现反射。常用的反射类有 Assembly、Type、MethodInfo 等类。
下面是一个使用反射创建类型、调用方法的示例:
using System;
using System.Reflection;
namespace MyReflectionApp
{
class Program
{
static void Main(string[] args)
{
// 加载 MyClassLibrary.dll 程序集
Assembly assembly = Assembly.LoadFrom(@"C:\MyProject\MyClassLibrary.dll");
// 获取 MyClass 类型
Type type = assembly.GetType("MyClassLibrary.MyClass");
// 创建 MyClass 实例
object myClassInstance = Activator.CreateInstance(type);
// 获取 PrintMessage 方法信息
MethodInfo printMessageMethod = type.GetMethod("PrintMessage");
// 调用 PrintMessage 方法
printMessageMethod.Invoke(myClassInstance, new object[] { "Hello World!" });
}
}
}
以上程序首先加载 MyClassLibrary.dll 程序集,然后获取 MyClass 类型。接着创建 MyClass 实例,并获取 PrintMessage 方法信息。最后调用 PrintMessage 方法输出 Hello World!。
另一个通过反射获取属性,并修改属性值的示例:
using System;
using System.Reflection;
namespace MyReflectionApp
{
class Program
{
static void Main(string[] args)
{
// 加载 MyClassLibrary.dll 程序集
Assembly assembly = Assembly.LoadFrom(@"C:\MyProject\MyClassLibrary.dll");
// 获取 MyClass 类型
Type type = assembly.GetType("MyClassLibrary.MyClass");
// 创建 MyClass 实例
object myClassInstance = Activator.CreateInstance(type);
// 获取 Message 属性信息
PropertyInfo messageProperty = type.GetProperty("Message");
// 获取 Message 属性的旧值
string oldMessage = (string)messageProperty.GetValue(myClassInstance);
// 修改 Message 属性的值
messageProperty.SetValue(myClassInstance, "New Message!");
// 获取 Message 属性的新值
string newMessage = (string)messageProperty.GetValue(myClassInstance);
// 输出结果
Console.WriteLine("Old Message: " + oldMessage);
Console.WriteLine("New Message: " + newMessage);
}
}
}
以上程序首先加载 MyClassLibrary.dll 程序集,然后获取 MyClass 类型。接着创建 MyClass 实例,并获取 Message 属性信息。接着获取 Message 属性的旧值,并修改它的值。最后获取 Message 属性的新值,并输出结果。
以上就是关于 C# 程序集和反射的详细讲解,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 程序集和反射详解 - Python技术站