我们如何获得对当前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[] { });

这个人是如何得到这些反射字段名的?

我们如何获得对当前HttpRuntime的引用

实际上,代码所做的相当于:

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成员通常被认为是不好的做法,因为这样做依赖于实现机制,而实现机制并不能得到保证,并且允许在不同版本和不同实现之间发生变化。