在其基类列表中查找派生类

6 c# polymorphism list

所以我有一个 BaseClass 列表,我用派生类的几个实例(每个派生类只有一个)填充它,以便我们有类似的东西:

List<BaseClass> myList = new List<BaseClass>();

myList.Add(new DerivedClassA());
myList.Add(new DerivedClassB());
myList.Add(new DerivedClassC());
Run Code Online (Sandbox Code Playgroud)

现在我希望能够用这样的东西搜索 myList:

public void FindClass (BaseClass class){ //class is a derived class
   //find index or object of type class
   //so that if class is a DerivedClassB
   //we return the first DerivedClassB in myList 
}
Run Code Online (Sandbox Code Playgroud)

这可能吗?我知道我可以给每个 DerivedClass 一个 name 属性并通过它的名字找到它,但我不想这样做。

3dd*_*3dd 5

另一种解决方案是使用 'OfType<>' 来过滤列表

public class Base { }

public class DerivedA : Base { }
public class DerivedB : Base { }

List<Base> instances = new List<Base>();
instances.Add(new DerivedA());
instances.Add(new DerivedB());

 var results = instances.OfType<DerivedA>().FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

编辑 - 这是一种创建可以进行搜索的方法的方法

T Find<T>() where T : Base {
    return _Instances.OfType<T>().FirstOrDefault();
}
Run Code Online (Sandbox Code Playgroud)


Dom*_*see 2

如果传入 的实例DerivedClassB,则可以DerivedClassB通过比较传入实例的实际类型和列表中实例的实际类型来找到 的所有实例:

public IEnumerable<BaseClass> FindClass (BaseClass @class){ 
    return myList.Where(c => c.GetType() == @class.GetType());
}
Run Code Online (Sandbox Code Playgroud)