在C#中迭代通用列表

时间:2008-11-12 15:05:07

标签: c# generics

public class Item
{
        private int  _rowID;
        private Guid _itemGUID;

        public Item() { }

        public int Rid
        {
            get
            {
                return _rowID;
            }
            set {  }

        }

        public Guid IetmGuid
        {
            get
            {
                return _itemGuid;
            }
            set
            {
                _itemGuid= value;
            }

        }

}    

以上是我的自定义对象。

我有一个清单:

List<V> myList = someMethod;

其中V是Item的类型,我的对象。

我想迭代并获得这样的属性

foreach(V element in mylist)
{
   Guid test = element.IetmGuid; 
}

当我调试并查看'element'对象时,我可以看到'Quickwatch'中的所有属性,但我不能做element.IetmGuid。

4 个答案:

答案 0 :(得分:5)

您是否对通用类型V施加约束?您需要告诉运行时V可以是Item类型的子类型的任何类型。

public class MyGenericClass<V>
  where V : Item  //This is a constraint that requires type V to be an Item (or subtype)
{
  public void DoSomething()
  {
    List<V> myList = someMethod();

    foreach (V element in myList)
    {
      //This will now work because you've constrained the generic type V
      Guid test = element.IetmGuid;
    }
  }
}

注意,如果您需要支持多种项目(由Item的子类型表示),则以这种方式使用泛型类是有意义的。

答案 1 :(得分:3)

尝试按照以下方式声明您的列表:

List<Item> myList = someMethod;

答案 2 :(得分:1)

foreach( object element in myList ) {
    Item itm = element as Item;
    if ( null == itm ) { continue; }
    Guid test = itm.ItemGuid;
}

答案 3 :(得分:1)

您的清单应按照以下方式声明:

List<V> myList = someMethod;

其中V是类型项。

然后你的迭代是正确的:

foreach(V element in myList)
{
    Guid test = element.IetmGuid;
}