gpt4 book ai didi

c# - Uri 类的反射 GetValue 失败

转载 作者:行者123 更新时间:2023-11-29 19:12:45 26 4
gpt4 key购买 nike

我想访问 Uri 类的 m_Info 字段以更改其中的一些字段。但是 uriInfo.GetValue(uri) 返回 null。

        var uri = new Uri("https://stackoverflow.com/questions/12993962/set-value-of-private-field");
var uriInfo = typeof(Uri).GetField("m_Info", BindingFlags.NonPublic | BindingFlags.Instance);
var infoField = uriInfo.GetValue(uri);

代码对于我的测试类工作正常,具有与 Uri 相同的结构,但对于 System.Uri 类却失败了。有什么想法吗?

最佳答案

很简单:m_Info未分配在该代码路径中;它延迟分配在第一次需要时。在本地,这有效:

object infoField = uriInfo.GetValue(uri); // null
var port = uri.Port; // forces it to initialize
infoField = uriInfo.GetValue(uri); // not null

但是请注意,这种方法本身并不完全涵盖;在反射器中寻找 .Port,这只适用于“简单语法”(不管是什么意思):

if (this.m_Syntax.IsSimple)
{
this.EnsureUriInfo();
}
else
{
this.EnsureHostString(false);
}
if (this.InFact(Flags.HostNotParsed | Flags.NotDefaultPort))
{
return this.m_Info.Offset.PortValue;
}
return this.m_Syntax.DefaultPort;

要点是:保证 m_Info 有一个值是非常重要的。您可能想先尝试通过反射调用 EnsureInfoInfo() 方法。

关于c# - Uri 类的反射 GetValue 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44694790/

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