天天看點

C# 可以利用反射給隻讀屬性指派嗎?

結論:可以

驗證demo如下:

運作winform程式輸出:

C# 可以利用反射給隻讀屬性指派嗎?

小注:

        typedescriptor.getproperties用來setvalue這沒有作用:

那麼為什麼typedescriptor.getproperties用來setvalue沒有效果呢?

将上面的代碼拆成如下兩句:

單點跟蹤進去,可以發現:

C# 可以利用反射給隻讀屬性指派嗎?

在擷取到propertydescriptor這個抽象類的執行個體後,在調用setvalue方法的時候,是從其子類reflectpropertydescriptor調用的。

C# 可以利用反射給隻讀屬性指派嗎?
C# 可以利用反射給隻讀屬性指派嗎?

而具體的實作是在子類:reflectpropertydescriptor中,從微軟源碼中找到reflectpropertydescriptor及setvalue

從代碼中可以看出來,隻讀屬性直接被跳過去了。。。。。。

那麼propertyinfo有沒有什麼限制呢?

propertyinfo調用的setvalue如下所示:

C# 可以利用反射給隻讀屬性指派嗎?

在微軟開源的代碼中可以找到其具體實作如下:

暫時沒有看到propertyinfo調用的setvalue有什麼限制

<a target="_blank" href="https://msdn.microsoft.com/zh-cn/library/scfx0019">propertyinfo.getsetmethod 方法 (boolean)</a>

C# 可以利用反射給隻讀屬性指派嗎?