我们怎样才能获得对当前HttpRuntime的引用?

时间:2011-07-30 16:54:38

标签: c# asp.net

有人可以告诉我这段代码在做什么:

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[] { });

该人如何获得这些反射字段名称?

1 个答案:

答案 0 :(得分:2)

实际上,代码的作用相当于:

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);

请注意,使用反射来访问非公共成员通常被认为是不好的做法,因为这样做依赖于无法保证的实现机制,并且允许在不同版本之间以及实现之间进行更改。