在列表中获取已知类型的元素

时间:2015-02-17 21:09:32

标签: c# .net linq inheritance

我遇到派生类的问题。

我有一个父类和几个子类

public abstract class Parent
{}

public class Child1 : Parent
{}

public class Child2 : Parent
{}

public class Child3 : Parent
{}

然后我有一个这些对象的列表

List<Parent> myList = new List<Parent>(){ new Child1(), new Child2(), new Child2() .....};

我想要一个函数来检索此列表的对象,指定其类型。现在,我为每种子类型构建了一个这样的方法,但是当子类型数增加时,可能会出现问题

public Child1 GetChild1()
{
  Child1 child = myList.FirstOrDefault(ch => ch is Child1) as Child1;
  if(child == null)
  {
     child = new Child1;
     myList.Add(child);
  }
  return child;
}

我正在寻找像

这样的东西
public Parent GetChild(Type typeOfChild)
-- or --
public Parent GetChild(string typeOfChild)
-- or --
public Parent GetChild<T>()

编辑:第一次进展

  private void GetChild<T>() where T : class
  {
     IEnumerable<T> list = myList.OfType<T>();
     T item;
     if(list.Count() > 0)
     {
        item= list.First<T>();
     }
     else
     {
        item= Activator.CreateInstance<T>();
     }
     myList.Add(workspace); //invalid argument
  }

编辑:解决方案

   private void GetChild<T>() where T : Parent, new()
   {
     T item = myList.FirstOrDefault(ch => ch is T) as T;
     if(item == null)
     {
        item = new T();
        myList.Add(item);
     }
     OtherMethod(item);
   }

2 个答案:

答案 0 :(得分:6)

您可以使用myList.OfType<Child1>()

OfType<T>根据指定的类型过滤IEnumerable的元素。

Read more...

答案 1 :(得分:1)

感谢Alexei提供更清洁的解决方案

private void GetChild<T>() where T : Parent, new()
{
   T item = myList.FirstOrDefault(ch => ch is T) as T;
   if(item == null)
   {
      item = new T();
      myList.Add(item);
   }
   OtherMethod(item);
}