如何覆盖List <t>添加方法

时间:2016-12-19 21:39:42

标签: c# asp.net .net

我将以下内容作为对整数列表进行非规范化的方法:

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

1 个答案:

答案 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;
    }
}