我想访问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类失败。有什么想法吗?
答案 0 :(得分:2)
非常简单:m_Info
未在该代码路径中分配;首次需要时 lazily 分配 。在本地,这有效:
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()
方法。