详解C# 通过反射获取对象的几种方式比较
概述
在 C# 中,有很多种方式获取对象,其中最常见的方式是使用 new
关键字实例化一个对象。但是在某些场景下,比如需要动态加载程序集或者需要通过配置文件指定对象类型等,就需要使用 C# 中的反射机制获取对象。
本文将详细讲解 C# 中使用反射机制获取对象的几种方式,并进行比较。
通过 Type 类型的静态方法获取对象
Type 类型在 C# 中代表一个类型,通过 Type 类型的静态方法可以获取一个类型的实例。有以下几种常见的方法:
1. GetType 方法
如果已知一个对象的实例,可以通过该对象的 GetType 方法获取该对象的类型。
var obj = new MyClass();
var type = obj.GetType();
2. typeof 运算符
如果已知一个类型的名称,可以通过 typeof 运算符获取该类型的 Type 实例。
var type = typeof(MyClass);
3. Type.GetType 方法
如果已知一个类型的名称和所在程序集的名称,可以通过 Type.GetType 方法获取该类型的 Type 实例。
var typeName = "MyNamespace.MyClass, MyAssembly";
var type = Type.GetType(typeName);
示例说明
class Person {
public string Name { get; set; }
public int Age { get; set; }
}
class Program {
static void Main(string[] args) {
// 获取类型实例
var type = typeof(Person);
// 创建实例
var obj = Activator.CreateInstance(type);
// 设置属性值
type.GetProperty("Name").SetValue(obj, "张三");
type.GetProperty("Age").SetValue(obj, 18);
// 获取属性值
var name = type.GetProperty("Name").GetValue(obj);
var age = type.GetProperty("Age").GetValue(obj);
Console.WriteLine($"Name: {name}, Age: {age}");
}
}
通过 Assembly 类型加载程序集并获取对象
Assembly 类型代表一个程序集,通过该类型的静态方法可以加载程序集,进而获取该程序集中的类型实例。
示例说明
class Person {
public string Name { get; set; }
public int Age { get; set; }
}
class Program {
static void Main(string[] args) {
// 加载程序集
var assembly = Assembly.Load("MyApplication");
// 获得类型实例
var type = assembly.GetType("MyApplication.Person");
// 创建对象实例
var obj = Activator.CreateInstance(type);
// 设置属性值
type.GetProperty("Name").SetValue(obj, "张三");
type.GetProperty("Age").SetValue(obj, 18);
// 获取属性值
var name = type.GetProperty("Name").GetValue(obj);
var age = type.GetProperty("Age").GetValue(obj);
Console.WriteLine($"Name: {name}, Age: {age}");
}
}
通过泛型方法获取对象
如果一个类型是泛型类型,那么可以使用泛型方法来获取该类型的实例。
示例说明
class Person {
public string Name { get; set; }
public int Age { get; set; }
}
class Program {
static void Main(string[] args) {
// 创建 List<Person> 实例
var obj = CreateInstance<List<Person>>();
Console.WriteLine($"Type: {obj.GetType().FullName}");
}
static T CreateInstance<T>() {
return Activator.CreateInstance<T>();
}
}
比较各种方式的优缺点
通过 Type 类型的静态方法获取对象的方式最为常见,它可以直接对类型进行操作,并且支持通过字符串方式来获取类型。但是该方式无法处理动态加载程序集的情况。
通过 Assembly 类型加载程序集并获取对象的方式可以处理动态加载程序集的情况,但是需要知道程序集的名称,而且需要编写较多的代码来获取类型和实例。
通过泛型方法获取对象的方式简单、直观,代码量较少,但是仅适用于泛型类型。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C#通过反射获取对象的几种方式比较 - Python技术站