【问题标题】:Can I have a class with a generic list and expose that as the default value我可以有一个带有通用列表的类并将其公开为默认值吗
【发布时间】:2010-03-05 20:08:38
【问题描述】:

我基本上想在代码中做到这一点:

PersonList myPersonList;
//populate myPersonList here, not shown

Foreach (Person myPerson in myPersonList)
{
...
}

类声明

public class PersonList
{
 public List<Person> myIntenalList;

 Person CustomFunction()
 {...}
}

那么如何在我的类中公开“myInternalList”作为 Foreach 语句可以使用的默认值呢?或者我可以吗?原因是我目前有大约 50 个类正在使用 GenericCollection,我想迁移到泛型,但不想重写很多。

【问题讨论】:

  • “默认值”是什么意思? C# 没有像 VB 这样的默认属性。

标签: c# generics


【解决方案1】:

你可以让 PersonList 实现IEnumerable&lt;Person&gt;

public class PersonList : IEnumerable<Person>
{
    public List<Person> myIntenalList;

    public IEnumerator<Person> GetEnumerator()
    {
         return this.myInternalList.GetEnumerator();
    }

    Person CustomFunction()
    {...}
}

或者更简单,只需让 PersonList 扩展 List:

public class PersonList : List<Person>
{
    Person CustomFunction() { ... }
}

第一种方法的优点是不暴露List&lt;T&gt;的方法,而第二种方法更方便,如果你想要那个功能。此外,您应该将 myInternalList 设为私有。

【讨论】:

  • 我会选择让PersonList 实现IEnumerable&lt;Person&gt; 而不是从List&lt;Person&gt; 继承的解决方案。有关更多信息,请参阅我的答案:stackoverflow.com/questions/2136213/…
【解决方案2】:

最简单的方法是从您的通用列表中继承:

public class PersonList : List<Person>
{
   public bool CustomMethod()
   { 
     //...
   }

}

【讨论】:

  • 这也暴露了更改列表的方法,我不知道这是否是由 OP 指定的。如果不使用李的解决方案。
  • 从 .NET 集合类继承通常不是一个好主意。在这里查看我的回复:stackoverflow.com/questions/2136213/….
  • @LBushkin 仅当他们想要覆盖 add 等时才需要这样做。但仍然需要牢记一些好东西。
【解决方案3】:

您为什么不简单地将 PersonList 上的基类更改为 Collection&lt;Person&gt;?大概它已经可以枚举 Person,所以你的 foreach 仍然可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-29
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多