在C#中,类型信息和反射API提供了一种机制,使我们能够在运行时获取和操作代码的元数据。这些API允许我们动态地了解和处理类型、成员、属性、方法等的信息。
using System;
public class MyClass
{
public string Name { get; set; }
public void MyMethod(int value)
{
Console.WriteLine("Value: " + value);
}
}
public class Program
{
static void Main(string[] args)
{
Type myClassType = typeof(MyClass);
// 获取类型的名称
string typeName = myClassType.Name;
Console.WriteLine("Type Name: " + typeName);
// 获取类型的完全限定名
string fullName = myClassType.FullName;
Console.WriteLine("Full Name: " + fullName);
// 获取类型的成员信息
MemberInfo[] members = myClassType.GetMembers();
Console.WriteLine("\nMembers:");
foreach (var member in members)
{
Console.WriteLine(member.Name);
}
// 获取属性信息
PropertyInfo[] properties = myClassType.GetProperties();
Console.WriteLine("\nProperties:");
foreach (var property in properties)
{
Console.WriteLine(property.Name);
}
// 获取方法信息
MethodInfo[] methods = myClassType.GetMethods();
Console.WriteLine("\nMethods:");
foreach (var method in methods)
{
Console.WriteLine(method.Name);
}
}
}
在上述示例中,我们使用typeof运算符获取MyClass类型的Type对象。然后,我们使用Type对象的不同方法来访问类型的名称、完全限定名、成员信息、属性信息和方法信息。
using System;
using System.Reflection;
public class MyClass
{
public string Name { get; set; }
public void MyMethod(int value)
{
Console.WriteLine("Value: " + value);
}
}
public class Program
{
static void Main(string[] args)
{
// 创建对象实例
Type myClassType = typeof(MyClass);
object myObject = Activator.CreateInstance(myClassType);
// 设置属性值
PropertyInfo propertyInfo = myClassType.GetProperty("Name");
propertyInfo.SetValue(myObject, "John Doe");
// 调用方法
MethodInfo methodInfo = myClassType.GetMethod("MyMethod");
methodInfo.Invoke(myObject, new object[] { 42 });
// 获取属性值
string name = (string)propertyInfo.GetValue(myObject);
Console.WriteLine("Name: " + name);
}
}
在上述示例中,我们使用反射API来创建MyClass类型的对象实例,设置属性值,调用方法和获取属性值。 通过使用Activator.CreateInstance方法,我们创建了MyClass类型的对象实例。然后,使用GetProperty方法获取Name属性的PropertyInfo对象,并使用SetValue方法设置属性值。 使用GetMethod方法获取MyMethod方法的MethodInfo对象,并使用Invoke方法调用方法。 最后,使用GetValue方法获取Name属性的值,并将其转换为适当的类型进行使用。 通过使用类型信息和反射API,我们可以在运行时动态地获取和操作类型和成员的元数据,以实现更灵活和动态的编程方式。