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

C# 获取列表中已知类型的元素,c#,.net,linq,inheritance,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(), n

我对导数类有问题

我有一个父类和几个子类

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 Parent GetChild(Type typeOfChild)
-- or --
public Parent GetChild(string typeOfChild)
-- or --
public Parent GetChild<T>()
public父GetChild(Type-typeOfChild)
--或--
公共父项GetChild(字符串类型的子项)
--或--
公共父GetChild()
编辑:第一个进度

  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:class
{
IEnumerable list=myList.OfType();
T项;
如果(list.Count()>0)
{
item=list.First();
}
其他的
{
item=Activator.CreateInstance();
}
myList.Add(工作区);//参数无效
}
编辑:解决方案

   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);
   }
private void GetChild(),其中T:Parent,new()
{
T item=myList.FirstOrDefault(ch=>ch是T)作为T;
如果(项==null)
{
项目=新的T();
myList.Add(项目);
}
其他方法(项目);
}

您可以使用
myList.OfType()

OfType
根据指定类型过滤
IEnumerable
的元素


感谢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);
}
private void GetChild(),其中T:Parent,new()
{
T item=myList.FirstOrDefault(ch=>ch是T)作为T;
如果(项==null)
{
项目=新的T();
myList.Add(项目);
}
其他方法(项目);
}

你跑得更快了!:)好的,问题的第一部分。但是如何将新项目添加到列表中?我编辑了我的问题以显示。
myList.Add(new Child1())
?请不要在问题中发布答案(自我回答是可以的,当简单的
new
限制将直接允许相同的行为时,您使用反射也没有意义…)还不允许自我回答(限制时间…)。请详细说明你的评论好吗?我不太明白。谢谢
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);
}