我和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
是不够的。
这个难题有什么聪明的解决方案吗?我在这里完全不知所措......
答案 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中添加此类断言。