我将以下内容作为对整数列表进行非规范化的方法:
public string DbUsersMessaged { get; set; }
public List<int> UsersMessaged {
get {
return string.IsNullOrEmpty(DbUsersMessaged) ? new List<int>() : DbUsersMessaged.Split(',').Select(Int32.Parse).ToList();
}
set {
DbUsersMessaged = value != null ? String.Join(",", value) : null;
}
}
要阅读,我可以查询sersMessaged.Contains(id)
。
要写,我只想做UsersMessaged.Add(id)
,但这不起作用,因为set
没有被调用。
目前,我这样做是为了触发set
:
UsersMessaged = UsersMessaged.AddReassign(user);
public static List<int> AddReassign(this List<int> list, int item)
{
var tempList = list;
if (list.Contains(item))
return list;
tempList.Add(item);
list = tempList;
return list;
}
但这并不理想,因为我始终AddReassign
。理想情况下,我可以使用Add
。另外一个答案,我知道我可以通过以下方式覆盖Add
方法:
public class DbList : List<int>
{
public override void Add(int value)
{
// AddReassign logic goes here
}
}
但是我有一些问题:
Add
?我已经在语法上挣扎了一段时间。 get
如何改变上述内容?我知道我需要返回DbList
,但如何从DbList
干净地实例化IEnumberable
?int
? 答案 0 :(得分:-1)
继承和影子,像这样:
class MyList<T> : List<T>
{
public new void Add(T item)
{
if (!this.Contains(item)) base.Add(item);
}
}
调用Add
的祖先类的任何方法仍将调用Add
的旧版本(即此处没有多态),但是使用该类的任何代码都将调用新的版本Add
,它将使用您提供的逻辑防止重复。
如果你已经有一堆List&lt;&gt;对象并需要将它们转换为MyList,添加一个静态&#34; From&#34;方法,像这样:
class MyList<T> : List<T>
{
...
static public MyList<T> FromList(List<T> source)
{
MyList<T> newList = new MyList<T>();
foreach (var item in source)
{
newList.Add(item);
}
return newList;
}
}