簡體   English   中英

反射GetValue對於Uri類失敗

[英]Reflection GetValue fails for Uri class

我想訪問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()方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM