在集合中的对象上设置get-only属性

时间:2016-10-05 12:04:10

标签: c#

我和this other post有类似的问题我有课

public class MyClass
{
    // other properties
    public bool IsDefault { get; internal set; }
}

我有一个定义为

的集合类
public class MyCollection : ICollection<MyClass>
{
    private List<MyClass> _itemList = new List<MyClass>();

    public void SetAsDefault(MyClass item)
    {
        // Make sure no other items are default.
        _itemList.ForEach(x => x.IsDefault = false);

        // Set specified item as default.
        _itemList.Find(x => x.Equals(item)).IsDefault = true;
    }
}

我想确保只有MyCollection中的单个项目被标记为默认值,同时能够直接在MyClass上检查特定实例是否为默认值。将MyClass.IsDefault的setter标记为程序集之外的internal开发人员无法设置IsDefault。但是,在我的情况下,我想避免设置IsDefault属性的开发人员可以访问程序集内部,因此使用internal是不够的。

这个难题有什么聪明的解决方案吗?我在这里完全不知所措......

2 个答案:

答案 0 :(得分:1)

我认为这很难干净利落。由于每个其他开发人员都可以在其他地方设置Property,我会尝试将问题转移到周围。

您可以删除Objects属性并使其成为集合上的属性。由于有人可以检索MyClass实例并设置它,您可以向MyCollection添加一个方法,检查MyClass实例是否是该集合中的默认实例。

否则我没有看到真正禁止你想要的任何好方法。

答案 1 :(得分:1)

如果您想获取或设置特定集合的默认实例,则需要使用属性:

public MyClass Default { get; set; }

MyCollection类上定义。

如果您想知道给定MyClass的实例是否是特定集合的默认值,您需要方法:

public bool IsDefaultFor(MyCollection collection) {
    return collection.Default == this;
}

如果您要求默认实例成为集合的成员,请在Default属性和Remove方法的setter中添加此类断言。