2015-01-05 8 views
2

Я написал этот код (только первая строка имеет значения):Создать метод с родовыми параметрами

public void InsertIntoBaseElemList(ref List<XElem> List, XElem Element) 
{ 
    for (int index = 0; index < List.Count; index++) { 
     if (List[index].Position < Element.Position && index + 1 == List.Count) { 
      List.Add(Element); 
     } else if (List[index].Position > Element.Position) { 
      List.Insert(index, Element); 
     } 
    } 
} 

Этот метод в основном вставляет элемент типа XElem в список типа XElem.
(Оба параметра должны иметь одинаковый тип. XElem в этом случае)

У меня есть несколько из этих списков, но у них нет одинакового типа.
Чтобы разрешить вставку элементов типа YElem в список типов YElem, мне пришлось бы скопировать этот метод и изменить типы параметров.

Возможно ли написать один метод, который может обрабатывать несколько типов в качестве параметра, с параметрами гарантии 1 и параметром 2 одного типа?
Я читал о родовых типах, но я could'nt сделать его работу ...

+0

Базовый класс не является общим, правильным? – im1dermike

+0

он спрашивает о родовом решении – Jonesopolis

+3

Как примечание стороны, 'ref' у вас там кажется бессмысленным. – Chris

ответ

1

попробовать это:

public void InsertIntoBaseElemList<T>(ref List<T> List, T Element) 
where T : BaseElem 

предполагая XElem и YElem наследует от BaseElem

+0

Вот и все! Большое спасибо! Я соглашусь через 5 минут ... –

+0

Почему я получил downvoted? –

+0

Там вы идете. Я не уменьшал рейтинг btw –

4

Предполагая, что тип реализуют одинаковый интерфейс или базовый тип, вы можете сделать следующее:

public void InsertIntoBaseElemList<TElem>(ref List<TElem> List, TElem Element) where TElem : IElem { 
    for (int index = 0; index < List.Count; index++) { 
     if (List[index].Position < Element.Position && index + 1 == List.Count) { 
      List.Add(Element); 
     } else if (List[index].Position > Element.Position) { 
      List.Insert(index, Element); 
     } 
    } 
} 

где положение ограничивает тип, который может быть указан как параметр, и позволяет вам обращаться к свойствам & методов этого типа в методе.

2

Вы хотите что-то вроде следующего:

public void InsertIntoBaseElemList<T>(List<T> List, T Element) where T : IElem 
{ 
    for (int index = 0; index < List.Count; index++) 
    { 
     if (List[index].Position < Element.Position && index + 1 == List.Count) 
      List.Add(Element); 
     else if (List[index].Position > Element.Position) 
      List.Insert(index, Element); 
    } 
} 

Использование IElem в качестве интерфейса, определяющего Position и реализуется XElem и YElem.
Если Position определен в общем базовом классе, вы также можете использовать это, например. where T : BaseElem.

Параметр ref не требуется, так как List<T> является ссылочным типом.

По вашему объяснению следующее может быть альтернативный подход к вашей проблеме, которую легче понять/поддерживать IMO:

public void InsertIntoBaseElemList<T>(List<T> List, T Element) where T : BaseElem 
{ 
    var index = List.FindIndex(i => i.Position > Element.Position); 
    if (index < 0) // no item found 
     List.Add(Element); 
    else 
     List.Insert(index, Element); 
} 
+0

@ChrFin Существует около 10 списков, таких как готовый, готовый, готовый, неудачный. Все элементы в этих списках должны иметь определенный порядок. Вид представлен как Позиция. При перемещении одного элемента из одного списка в другой я не могу добавить его в конец нового списка, что нарушит порядок в списке. Я должен найти правильный Позиция в новом списке на основе других элементов и вставить его прямо там. –

+0

@NoelWidmer: Теперь я понимаю, пожалуйста, взгляните на мой альтернативный подход, возможно, вам также понравится больше ... – ChrFin

1

Предполагая, что XElem является созданный пользователем класс, вы можете сначала создать интерфейс IElem, который содержит общие свойства XElem и YElem (например, Position). Затем заставьте XElem и YElem реализовать созданный вами интерфейс и подписи метода используйте интерфейс вместо конкретного класса. Пример ниже:

public interface IElem 
{ 
    int Position {get; set; } 
} 

public class XElem : IElem ... 

public void InsertIntoBaseElemList(ref List<IElem> List, IElem Element) 
Смежные вопросы