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

Gui*_*meA -5 .net c# linq inheritance

我有衍生类的问题.

我有一个父类和几个子类

public abstract class Parent
{}

public class Child1 : Parent
{}

public class Child2 : Parent
{}

public class Child3 : Parent
{}
Run Code Online (Sandbox Code Playgroud)

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

List<Parent> myList = new List<Parent>(){ new Child1(), new Child2(), new Child2() .....};
Run Code Online (Sandbox Code Playgroud)

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

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

我正在寻找类似的东西

public Parent GetChild(Type typeOfChild)
-- or --
public Parent GetChild(string typeOfChild)
-- or --
public Parent GetChild<T>()
Run Code Online (Sandbox Code Playgroud)

编辑:第一个进展

  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
  }
Run Code Online (Sandbox Code Playgroud)

编辑:解决方案

   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);
   }
Run Code Online (Sandbox Code Playgroud)

Ham*_*jam 6

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

OfType<T>过滤IEnumerable基于指定类型的元素.

阅读更多...

  • 你显然更快!:) (2认同)