如何调用泛型方法,我听说过反思,但我觉得我做错了,请检查。
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;
}
}
答案 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();