2016-01-11 3 views
3

Итак, у меня есть список BaseClass, и я заполнил его несколькими экземплярами производных классов (только один из каждого производного класса), так что у нас есть что-то вроде:Найти производный класс в списке его базового класса

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

myList.Add(new DerivedClassA()); 
myList.Add(new DerivedClassB()); 
myList.Add(new DerivedClassC()); 

Теперь я хочу, чтобы иметь возможность искать 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 
} 

возможно ли это? Я знаю, что могу дать каждому DerivedClass свойство name и найти его по имени, но я не хочу этого делать.

+1

Вы можете использовать 'is'' keyword', чтобы определить, имеет ли он производный тип. – Ian

+3

Вы действительно хотите, чтобы «FindClass» требовал передать * экземпляр * в качестве параметра? Будет ли «Тип» не более подходящим здесь? (Или как простой параметр, либо как общий тип параметра) –

+0

Вы на 100% правы, и вместо этого я должен использовать тип как параметр. Слишком долго. Я буду использовать это решение, но так как кто-то дал мне ответ на вопрос, как это сделать с экземпляром, я отмечу это как правильно, если кто-то сможет использовать это решение. – Stoddard

ответ

2

Если вы передаете в экземпляре DerivedClassB, вы можете найти все экземпляры DerivedClassB путем сравнения фактического типа экземпляра передается в и из экземпляров в списке:

public IEnumerable<BaseClass> FindClass (BaseClass @class){ 
    return myList.Where(c => c.GetType() == @class.GetType()); 
} 
+0

Вы должны изменить свой параметр класса как @class. –

+0

@uygardonduran справа, спасибо за напоминание :) – Domysee

0

Вы можете сделать это с помощью оператора is. Он сообщает вам, является ли объект определенного типа. Добавьте немного LINQ, и вы получите:

var firstB = myList 
     .Where(c => c is DerivedClassB) 
     .First(); 
+0

Это не работает, если вы не удалите 'typeof'. –

+0

Действительно. Виноват. Я не скомпилировал это. Я исправлю это. – Will

+0

Просто используйте 'myList.First (c => c is DerivedClassB)', если вы это сделаете. –

2

Другим решением было бы использовать '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(); 

EDIT - Это способ создания метода, который бы выполнял поиск

T Find<T>() where T : Base { 
    return _Instances.OfType<T>().FirstOrDefault(); 
} 
+0

Можно ли заменить'DerivedA 'на входной параметр, а не на hardcoding? –

+0

@ ChristianHolmJørgensen да, это, пожалуйста, см. Мое редактирование выше – 3dd