簡體   English   中英

使用反射獲取基類的受保護屬性值

[英]Get protected property value of base class using reflection

我想知道是否可以訪問位於對象基類中的 ConfigurationId 屬性的值,並且它是私有的。 我試圖通過反思來做到這一點,但沒有運氣。 在此處輸入圖像描述

要訪問 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 這也意味着您需要使用確切的綁定,但請注意,矛盾的標志(例如同時使用NonPublicPublic )是有效的,並且會在此時返回。

請注意,查找非公共成員的非常需要可能被視為代碼異味,您應該非常小心地這樣做。 另請注意,不保證非公共成員在不同版本中具有相同的名稱。

暫無
暫無

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

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