簡體   English   中英

隱藏基類的Set屬性

[英]Set Property of hidden base base class

我有以下代碼:

public class Ancestor
{
    public string Property {get; protected set;}
}

public class Base : Ancestor
{
    public string Property {get; set;}
}

public class Derived : Base
{
    public Derived(string message)
    {
        //I need both properties to have the message value
    }
}

祖先類和基類不是我的代碼,我無法更改它們。
有什么方法可以設置祖先的message值嗎?
顯然,僅執行以下操作是行不通的

Ancestor ancestor = this;
ancestor.Property = message

因為設置器受到保護。

僅通過反射:

 public class Derived : Base
{
    public Derived(string message)
    {
        Type type = typeof(Ancestor);
        Ancestor a = (Ancestor)this;
        type.GetProperty("Property").SetMethod.Invoke(a, new[] { message });
    }
}

我找到了滿足我需求的解決方案。 我的祖先類派生自一個接口:

public interface IAncestor
{
    string Property { get; }
}

我所做的是使用顯式接口聲明,如下所示:

public class Derived : Base, IAncestor
{
    public Derived(string message)
    {
        Property = message;
        base.Property = message;
    }
    string IAncestor.Property{get { return Property; }}
}

現在,以下測試通過:

[TestMethod]
public void ValidatePropertyIsFullyPopulated()
{
    const string expectedMessage = "hello!";
    var derived = new Derived(expectedMessage);
    Base baseClass = derived;
    IAncestor ancestor = derived;
    Assert.AreEqual(expectedMessage, derived.Property);
    Assert.AreEqual(expectedMessage, baseClass.Property);
    Assert.AreEqual(expectedMessage, ancestor.Property);

    //Notice that this Assert WILL fail because Ancestor.Property is
    //not marked as virtual.
    Ancestor ancestorClass = derived;
    //Assert.AreEqual(expectedMessage, ancestorClass.Property);
}

暫無
暫無

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

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