有人可以告诉我这段代码在做什么:
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[] { });
该人如何获得这些反射字段名称?
答案 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);
请注意,使用反射来访问非公共成员通常被认为是不好的做法,因为这样做依赖于无法保证的实现机制,并且允许在不同版本之间以及实现之间进行更改。