调用泛型方法c#

时间:2016-02-12 13:44:58

标签: c# generics reflection

如何调用泛型方法,我听说过反思,但我觉得我做错了,请检查。

 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);
    }

更新2。 这里有更多关于我在班级MergeSort中的信息以及为什么我使用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;
    }

}

2 个答案:

答案 0 :(得分:3)

查看您要离开的评论以及您遇到的问题。在我看来,你的意图是将LinkedList传递给这个方法,所以它应该是:

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

然后你应该像这样调用:

var head = new LinkedList<int>();

MergeSortLL<int>(head)

您看到我已将int设置为我希望方法约束的类型。

但是,因为您将使用强类型LinkedList,C#编译器将隐式设置<int>方法上的MergeSortLL,从而减​​少对以下内容的调用:

MergeSortLL(head);

您还对基因类型T设置了一个通用约束,确保您使用的任何类型继承自IComparable<T>,当说出大声的声音时有点奇怪,但似乎是正确的。

答案 1 :(得分: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();