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);
}