Перегрузка метода, который принимает общий список с разными типами в качестве параметра

Как я могу перегрузить метод, который принимает универсальный список с разными типами в качестве параметра?

Например:

У меня есть два метода:

private static List<allocations> GetAllocationList(List<PAllocation> allocations)
{
    ...
}

private static List<allocations> GetAllocationList(List<NPAllocation> allocations)
{
    ...
}

Есть ли способ объединить эти 2 метода в один?


person Jon    schedule 29.05.2009    source источник


Ответы (2)


Конечно, можно... используя дженерики!

private static List<allocations> GetAllocationList<T>(List<T> allocations) 
   where T : BasePAllocationClass
{

}

Это предполагает, что все ваши "выделения", "PAllocation" и "NPAllocation" имеют общий базовый класс, называемый "BasePAllocationClass". В противном случае вы можете удалить ограничение «где» и выполнить проверку типа самостоятельно.

person womp    schedule 29.05.2009
comment
Я использую ваше предложение, но как мне выполнить проверку типов? Мне также нужно перебрать параметр распределения. Я пытался использовать аллокации.ForEach(delegate(PAllocation pa){...}); но я получаю сообщение об ошибке "Несовместимая сигнатура анонимной функции". Любые идеи? - person Jon; 29.05.2009
comment
нельзя ли просто сделать (foreach var в распределениях)? - person womp; 29.05.2009

Если ваши PAllocation и NPAllocation имеют общий интерфейс или базовый класс, вы можете создать метод, который просто принимает список этих базовых объектов.

Однако, если они этого не делают, но вы все еще хотите объединить два (или более) метода в один, вы можете использовать для этого дженерики. Если бы объявление метода было примерно таким:

private static List<allocations> GetCustomList<T>(List<T> allocations)
{
    ...
}

то вы можете вызвать его, используя:

GetCustomList<NPAllocation>(listOfNPAllocations);
GetCustomList<PAllocation>(listOfPAllocations);
person rmoore    schedule 29.05.2009
comment
часть ‹NPAllocation› и ‹PAllocation› можно опустить, потому что тип будет определен автоматически - person configurator; 29.05.2009