abdul subhan mohammed Ответов: 2

Как передать список ienumerable в качестве параметра в C#


Дорогие Все,

У меня есть кандидат, сертификаты и экзаменационная сессия в качестве класса.

И я получаю их в списке, IEnumerable & lt;candidate> Для списка кандидатов,
Интерфейс IEnumerable&ЛТ;ceritificates&ГТ; для списка сертификатов и IEnumerable&ЛТ;examsessions&ГТ; для список ExamSession.

Что я уже пробовал:

Now, my question is:

I wrote a method, in which, i want to pass IEnumerable<> as a Parameter. Here I don't which object I will call(Candidate/Certificate/ExamSession).

Can any one please help me, how to pass IEnumerable as a parameter in a given method...


Thanks

Graeme_Grant

Опубликуйте свой код, чтобы мы могли видеть...

Graeme_Grant

Отправляя свой код, я имею в виду нажать на кнопку Улучшить вопрос

2 Ответов

Рейтинг:
8

OriginalGriff

Если эти три класса не имеют общего базового класса, вы не можете передать их коллекцию методу, кроме как в виде коллекции object экземпляров, не больше, чем вы могли бы написать метод, который взял бы один экземпляр любого из трех классов, если только нет прямого преобразования из A В B и наоборот.

Таким образом, вы могли бы передать коллекции объектов:

List<MyClass> obs = new List<MyClass>();
...
MyMethod(obs);
...
public void MyMethod(IEnumerable<object> collection)
   {
   ...
   }
Но это очень плохой дизайн.
И маловероятно, что будет веская причина для того, чтобы три класса, о которых вы упоминаете, имели общую базу, поэтому маловероятно, что будет веская причина для написания одного метода, чтобы взять коллекцию всех трех классов, так как в значительной степени первое, что он должен был бы сделать, это выяснить, что он был передан, чтобы он мог привести объекты соответствующим образом, чтобы использовать их.
Лучшим - но не намного-подходом было бы создание четырех перегрузок:
public void MyMethod(IEnumerable<Candidate> c) { MyMethod(c, null, null); }
public void MyMethod(IEnumerable<Certificates> c) { MyMethod(null, c, null); }
public void MyMethod(IEnumerable<ExamSession> c) { MyMethod(null, null, c); }
public void MyMethod(IEnumerable<Candidate> cand, IEnumerable<Certificates> cert, IEnumerable<ExamSession> es)
    {
    ...
    }
Поскольку, по крайней мере, таким образом вы можете проверить более легко и сохранить некоторую сильную типизацию.

Но, честно говоря, вам было бы лучше переосмыслить этот подход.


Graeme_Grant

Дженерики работают гораздо лучше, если функциональность является общей.

OriginalGriff

Вот почему я не предложил универсальное решение - если нет общего базового класса и, следовательно, ограничения, это так же плохо, как передача коллекции объектов!

Graeme_Grant

Я вовсе не возражаю. :)

Рейтинг:
17

Graeme_Grant

Непонятно, о чем вы просите, но вот 2 примера...

1. Стандарт

void FuntionName(IEnummerable<candidate> Data)
{
    // do stuff with data...
}
2. Общий
void FuntionName<T>(IEnummerable<T> Data)
{
    // do stuff with data...
}
Довольно просто-программирование 101...


abdul subhan mohammed

спасибо