2016-02-12 4 views
0

как назвать общий метод, я слышал об отражении, но я думаю, что я делаю неправильно, проверьте пожалуйста.Call generic method C#

public static LinkedListNode<T> MergeSortLL<T>(LinkedListNode<T> Head) where T : IComparable<T> 
    { 

     if (Head == null || Head.Next == null) 
     { 
      return Head; 
     } 
     LinkedListNode<T> middle = GetMiddle<T>(Head); 
     LinkedListNode<T> half = middle.Next; 
     middle.Next = null; 

     return Merge(Head, half); 

    } 

И вот я пытаюсь вызвать мой общий метод с параметрами

public void MSort() 
    { 
     Type type = typeof(MergeSort); 
     MethodInfo method = typeof(MergeSort).GetMethod("MergeSortLL"); 
     MethodInfo generic = method.MakeGenericMethod(type); 
     generic.Invoke(null, null); 
    } 

Update 2. Здесь больше информации, что я в моем классе и почему слиянием я использую IComparable

class MergeSort 
{ 

    public static LinkedListNode<T> MergeSortLL<T>(LinkedListNode<T> Head) where T : IComparable<T> 
    { 

     if (Head == null || Head.Next == null) 
     { 
      return Head; 
     } 
     LinkedListNode<T> middle = GetMiddle<T>(Head); 
     LinkedListNode<T> half = middle.Next; 
     middle.Next = null; 

     return Merge(Head, Head, half); 

    } 

    public static LinkedListNode<T> Merge<T>(LinkedListNode<T> Head, LinkedListNode<T> Left, LinkedListNode<T> Right) where T : IComparable<T> 
    { 

     LinkedListNode<T> mHead = Head; 
     LinkedListNode<T> curr = mHead; 

     while (Left != null && Right != null) 
     { 
      if (Left.Value.CompareTo(Right.Value) <= 0) 
      { 
       curr.Next = Left; 
       Left = Left.Next; 
      } 
      else 
      { 
       curr.Next = Right; 
       Right = Right.Next; 
      } 
      curr = curr.Next; 
     } 
     curr.Next = (Left == null) ? Right : Left; 

     return mHead.Next; 
    } 

    public static LinkedListNode<T> GetMiddle<T>(LinkedListNode<T> Head) where T : IComparable<T> 
    { 
     if (Head == null) 
     { 
      return Head; 
     } 

     LinkedListNode<T> slow, fast; 
     slow = fast = Head; 
     while (fast.Next != null && fast.Next.Next != null) 
     { 
      slow = slow.Next; fast = fast.Next.Next; 
     } 
     return slow; 
    } 

} 
+0

Вы можете посмотреть на эту должность в StackOverflow http://stackoverflow.com/questions/3957817/calling-generic-method-with-type-variable – Sidharh

+0

Просто 'результат вар = MergeSort.MergeSorLL (HeadNodeOfLinkedList) ; 'Дженерики будут выходить – juharr

+0

Дженерики и отражение не смешиваются хорошо. Если вы не знаете тип, вы не можете ничего сделать с _output_ во время компиляции. Если да, то нет необходимости использовать отражение, просто назовите его, как предлагает @juharr. –

ответ

3

Рассматривая комментарии, которые вы оставляете, и проблемы, с которыми вы сталкиваетесь. Мне кажется, что вы намерение передать LinkedList этому методу, поэтому он должен быть:

public static LinkedListNode<T> MergeSortLL<T>(LinkedList<T> Head) where T : IComparable<T> 

Тогда вы просто должны быть вызваны так:

var head = new LinkedList<int>(); 

MergeSortLL<int>(head) 

Вы видите, что я» ve установите int как тип, к которому я хочу, чтобы метод был ограничен.

Однако, поскольку у вас будет сильно типизированных LinkedList компилятор С # неявно установить <int> на MergeSortLL методе восстановителем вызов:

MergeSortLL(head); 

Вы также положить общие ограничения на genereic типа T, убедитесь, что любой тип, который вы используете, наследуется от IComparable<T>, который, когда громко звучит, звучит немного странно, но кажется правильным.

+0

Я думаю, что «MergeSort» - это класс, который содержит этот метод, а не тип, который содержится в общем связанном списке. – juharr

+0

Читая, как он вызвал метод, мне показалось, что я думаю, что я сделал. Тем не менее, я более склонен согласиться с вами ... Это просто совершенно ясно из ОП. –

+0

Я основываю его на 'typeof (MergeSort) .GetMethod (« MergeSortLL »)' – juharr

2

Если у вас есть LinkedList<T>, просто передайте его голова (через свойство First) в метод, и типы будут выведены.

var list = new LinkedList<int>(); 
var head = list.First; 
var sorted = MergeSort.MergeSortLL(head); 

Предполагая, что MergeSort статический класс, который вы могли бы сделать его метод расширения путем добавления this перед параметром LinkedListNode<T> Head, а затем его можно было бы назвать, как если бы это был метод экземпляра.

var sorted = head.MergeSortLL();