对于Uri类,反射GetValue失败

时间:2017-06-22 08:59:34

标签: c# android xamarin

我想访问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类失败。有什么想法吗?

1 个答案:

答案 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()方法。