我想创建一个像这样的collectionbase类构造:
在所有项目中达到(int NeedThisValue)的最佳做法是什么,这个类添加了什么?
public class SDataCollection : CollectionBase
{
public SDataCollection()
{
}
#region Properties
/// <summary>
/// Gets/Sets value for the item by that index
/// </summary>
public SData this[int index]
{
get
{
return (SData)this.List[index];
}
set
{
this.List[index] = value;
}
}
public int NeedThisValue { get; private set; }
#endregion
#region Public Methods
public int IndexOf(SData sDataItem)
{
if (sDataItem != null)
{
return base.List.IndexOf(sDataItem);
}
return -1;
}
public int Add(SData sDataItem)
{
if (sDataItem != null)
{
return this.List.Add(sDataItem);
}
return -1;
}
public void Remove(SData sDataItem)
{
this.InnerList.Remove(sDataItem);
}
public void AddRange(SDataCollection collection)
{
if (collection != null)
{
this.InnerList.AddRange(collection);
}
}
public void Insert(int index, SData sDataItem)
{
if (index <= List.Count && sDataItem != null)
{
this.List.Insert(index, sDataItem);
}
}
public bool Contains(SData sDataItem)
{
return this.List.Contains(sDataItem);
}
#endregion
}
答案 0 :(得分:1)
如果您希望仅通过SDataCollection的子类访问该属性,请使用访问修饰符
保护
如果您希望所有其他类访问该属性,请使用访问修饰符
公共
如果您不希望除SDataCollection之外的任何内容访问该属性,请使用
私有
这是 C#面向对象101。
答案 1 :(得分:0)
我假设您要从所有CData项访问相应NeedThisValue属性的值。 通常在这些情况下,我会在每个项目上设置父项的引用。 在CData课上,你可以创建一个属性:
internal SDataCollection Parent { get; set; }
然后你通过重写OnInsert / OnRemove / OnSet / OnClear来设置/取消设置Parent。您必须检查该项目是否仅由一个集合附加。
在任何情况下,我都试图避免这些情况。通常有一些更好的方法,但我不知道你的确切问题。
答案 2 :(得分:0)
你的要求有点不寻常,但这里...... [/ p>
我假设你希望SData
对象按需访问NeedThisValue
,因为它的值可能会随着时间的推移而改变 - 否则你可以在SData
上创建一个属性并注入值将对象添加到集合中时。
我也打算在集合中SData
检索时注入值,因为对检索到的项目的引用可能会很长时间。
这意味着剩下的唯一可行选择是在将每个SData
添加到集合时为每个public class SData
{
public SDataCollection ParentCollection { get; set; }
}
public class SDataCollection : CollectionBase
{
public int Add(SData sDataItem)
{
if (sDataItem != null)
{
sDataItem.ParentCollection = this;
return this.List.Add(sDataItem);
}
return -1;
}
}
提供一个引用:
SData
当您在其他代码中使用var thatMagicalValueYouWanted = myRandomSDataObject.ParentCollection.NeedThisValue;
项时,您可以执行以下操作:
{{1}}
现在我应该指出,这不是一个特别好的模式,但这是你的呼唤。