只读嵌套对象属性

本文关键字:属性 对象 嵌套 只读 | 更新日期: 2023-09-27 18:13:21

我在定义这两个类时遇到了问题:

public class Article
{
    public Article(long ID, string Name, ArticleFamily Family)
    {
        //...Initializer...
    }
    public ArticleFamily Family { get; set; }
    //Other props...
}
public class ArticleFamily
{
    public ArticleFamily(int ID, string Description)
    {
        //...Initializer...
    }
    public int ID { get; private set; }
    public string Description { get; set; }
}

我有一个集合Article,每一个都属于一个族。
现在,假设我有一个特定的ArticleFamily对象,我应该能够改变它的描述,它最终被持久化到数据库中。(为了简单起见,我省略了这部分)
但是我不应该这样做:

Article art = SomeMethodReturningArticle();
art.Family.Description = "SomeOtherValue";

我应该能够完全改变Article的Family,用一个新的ArticleFamily对象替换它,但是我不应该能够仅仅改变描述。
我应该创建一个具有只读属性的ArticleFamily类的副本吗?

public class ArticleFamilyReadonly
{
    ArticleFamily _family;
    public ArticleFamilyReadonly(ArticleFamily Family)
    {
        _family = Family;
    }
    public int ID { get { return _family.ID; } }
    //etc...
}

我怎样才能干净利落地做到这一点?

只读嵌套对象属性

这是我在LinqPad中拼凑的东西:

void Main()
{
    var art = new Article(1,"2", new ArticleFamily(1, "Test"));
    art.Family.Description = "What?"; // Won't work
    var fam = art.Family as ArticleFamily;
    fam.Description = "This works"; // This works...
}
public class Article
{
    public Article(long ID, string Name, IArticleFamily Family)
    {
        //...Initializer...
    }
    public IArticleFamily Family { get; set; }
    //Other props...
}
public class ArticleFamily : IArticleFamily
{
    public ArticleFamily(int ID, string Description)
    {
        //...Initializer...
    }
    public int ID { get; private set; }
    public string Description { get; set; }
}
public interface IArticleFamily
{
    int ID { get; }
    string Description { get;}
}

不能直接从Article对象编辑,除非强制转换为ArticleFamily对象。

相关文章: