![](/img/trans.png)
[英]Dynamic type shadow base class's property and set to protected using Reflection.Emit
[英]Get protected property value of base class using reflection
要訪問 ConfigurationId 屬性,我使用了以下代碼:
SubsetController controller = new SubsetController(new CConfigRepository(new FakeDataContextRepository()));
var myBaseClassProtectedProperty=
controller.GetType().BaseType
.GetProperty("CCITenderInfo", BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(controller);
var myProtectedProperty =
CCITenderInfo.GetType()
.GetProperty("ConfigurationId", BindingFlags.Public | BindingFlags.Instance)
.GetValue(myBaseClassProtectedProperty);
假設以下父類和子類:
class BaseClass
{
private string privateField = "I'm Private";
}
class ChildClass : BaseClass
{
}
您可以使用反射從ChildClass
實例中讀取privateField
的值,如下所示:
ChildClass childInstance = new ChildClass();
object privateFieldValue = childInstance.GetType().BaseType
.GetField("privateField", BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(childInstance);
Console.WriteLine(privateFieldValue); // I'm Private
要添加到這個答案 - 您應該肯定使用 Instance 和 NonPublic 綁定標志,但您還應該確保您實際上是在引用properties而不是fields 。
例如,如果你有
protected string Andrew;
無論您使用什么綁定標志,您都無法通過GetProperty
獲得此信息。 為什么 - 因為它是一個字段,而不是一個屬性......
要解決此問題,只需將其更改為
protected string Andrew {get;set;}
然后您可以使用 GetProperty 方法。
是的,這可以通過反射實現。
但是,為了查找非公共成員,您需要使用BindingFlags
參數的反射重載。 為了查找private
成員,您還需要通過基類的類型進行訪問,即使使用typeof
也是BindingFlags.FlattenHierarchy
。 這也意味着您需要使用確切的綁定,但請注意,矛盾的標志(例如同時使用NonPublic
和Public
)是有效的,並且會在此時返回。
請注意,查找非公共成員的非常需要可能被視為代碼異味,您應該非常小心地這樣做。 另請注意,不保證非公共成員在不同版本中具有相同的名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.