我们如何获得对当前HttpRuntime的引用
本文关键字:HttpRuntime 引用 何获得 我们 | 更新日期: 2023-09-27 18:03:56
谁能告诉我这段代码在做什么?
PropertyInfo p = typeof(HttpRuntime).GetProperty("FileChangesMonitor",
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);
object o = p.GetValue(null, null);
FieldInfo f = o.GetType().GetField("_dirMonSubdirs",
BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase);
object monitor = f.GetValue(o);
MethodInfo m = monitor.GetType().GetMethod("StopMonitoring",
BindingFlags.Instance | BindingFlags.NonPublic);
m.Invoke(monitor, new object[] { });
这个人是如何得到这些反射字段名的?
实际上,代码所做的相当于:
dynamic o = HttpRuntime.FileChangesMonitor;
dynamic monitor = o._dirMonSubdirs;
monitor.StopMonitoring();
BindingFlags。NonPublic允许通过反射访问非公共字段。如果没有反射,上面的代码将生成一个编译器错误。
反射字段名可以通过调试器获得,或者可以通过反射枚举类型。例如,要获取类型X的所有公共和非公共静态字段,可以使用:
MemberInfo[] mi = typeof(X).GetType().FindMembers(MemberTypes.Property,
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static,
(a, b) => true, // don't filter
null);
请注意,使用反射来访问非public成员通常被认为是不好的做法,因为这样做依赖于实现机制,而实现机制并不能得到保证,并且允许在不同版本和不同实现之间发生变化。