在asp.net开发中,反射允许程序在运行时检查、操作自身的结构和行为,不需要在编译阶段就确定所有类型信息,极大提升了代码的灵活性。本文通过多个实例展示反射的常见用法。

反射基础概念
反射的核心是System.Type类,所有反射操作都需要先获取目标类型的Type对象。在asp.net中,我们可以通过多种方式获取Type对象,比如直接使用typeof运算符,或者调用对象的GetType方法。
实例1:获取类型基本信息
首先我们定义一个简单的实体类,后续实例都基于这个类展开操作。
// 定义测试用的用户实体类
public class UserInfo
{
public int UserId { get; set; }
public string UserName { get; set; }
public string GetUserDesc()
{
return $"用户ID:{UserId},用户名:{UserName}";
}
}
下面的代码演示如何获取UserInfo类型的基本信息:
// 获取UserInfo类型的Type对象
Type userType = typeof(UserInfo);
// 输出类型名称
Response.Write($"类型名称:{userType.Name}<br/>");
// 输出类型的全限定名
Response.Write($"全限定名:{userType.FullName}<br/>");
// 输出是否为公共类型
Response.Write($"是否为公共类型:{userType.IsPublic}<br/>");
实例2:动态创建对象实例
反射可以在不知道具体类型的情况下,动态创建该类型的实例,不需要使用new关键字。
// 获取UserInfo的Type对象
Type userType = typeof(UserInfo);
// 调用无参构造函数创建实例
object userObj = Activator.CreateInstance(userType);
// 将实例转换为UserInfo类型(也可以不转换,通过反射操作属性)
UserInfo user = userObj as UserInfo;
user.UserId = 1;
user.UserName = "测试用户";
Response.Write($"创建的用户名:{user.UserName}<br/>");
实例3:动态操作对象属性
通过反射可以获取类型的所有属性,并且动态读取、修改属性的值,不需要直接访问属性名。
// 创建UserInfo实例
UserInfo user = new UserInfo { UserId = 2, UserName = "张三" };
Type userType = user.GetType();
// 获取UserName属性
var userNameProp = userType.GetProperty("UserName");
// 读取属性值
object currentValue = userNameProp.GetValue(user);
Response.Write($"修改前的用户名:{currentValue}<br/>");
// 修改属性值
userNameProp.SetValue(user, "李四");
Response.Write($"修改后的用户名:{user.UserName}<br/>");
实例4:动态调用对象方法
反射还可以动态调用类型的方法,包括有参数和无参数的方法,不需要在编译阶段确定方法调用逻辑。
// 创建UserInfo实例
UserInfo user = new UserInfo { UserId = 3, UserName = "王五" };
Type userType = user.GetType();
// 获取GetUserDesc方法,该方法无参数
var method = userType.GetMethod("GetUserDesc");
// 调用方法,第一个参数是实例对象,第二个是方法参数数组(无参数传null)
object result = method.Invoke(user, null);
Response.Write($"方法调用结果:{result}<br/>");
反射使用注意事项
- 反射操作的性能比直接代码调用低,不要在高频循环中使用反射
- 操作属性、方法时需要确保目标成员存在,否则会抛出
NullReferenceException - 如果类型是内部类型或者成员访问权限受限,需要设置
BindingFlags参数来获取非公共成员
以上实例覆盖了asp.net中反射的基础应用场景,开发者可以根据实际需求调整代码逻辑,实现更灵活的功能。