[英]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.