gpt4 book ai didi

c# - 我们如何获得对当前 HttpRuntime 的引用?

转载 作者:行者123 更新时间:2023-11-30 17:16:51 24 4
gpt4 key购买 nike

谁能告诉我这段代码在做什么:

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 允许通过使用反射访问非公共(public)字段。如果没有反射,上述代码会产生编译错误。

可以通过调试器获取反射字段名,也可以通过反射枚举类型。例如,要获取类型 X 的所有公共(public)和非公共(public)静态字段,您可以使用:

        MemberInfo[] mi = typeof(X).GetType().FindMembers(MemberTypes.Property,
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static,
(a, b) => true, // don't filter
null);

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

关于c# - 我们如何获得对当前 HttpRuntime 的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6884597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com