使用泛型参数创建方法

Create method with generic parameters

这段代码是我写的(只有第一行很重要):

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的类型相同?

我阅读了有关泛型类型的内容,但我无法让它发挥作用。

假设类型实现相同的接口或基类型,您可以执行以下操作:

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

where 子句限制了可以指定为参数的类型,并允许您在方法中访问该类型的属性和方法。

试试这个:

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

假设 XElem 和 YElem 继承自 BaseElem

您想要如下内容:

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并由XElemYElem实现。
如果 Position 是在公共基础 class 中定义的,您也可以使用它,例如where T : BaseElem.

不需要 ref 参数,因为 List<T> 是引用类型。

根据您的解释,以下可能是解决您问题的替代方法,understand/maintain 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);
}

假设XElem是用户创建的class,你可以先创建一个名为IElem的接口,它拥有XElem和YElem的共同属性(比如Position)。然后让 XElem 和 YElem 实现您创建的接口,并在方法的签名上使用接口而不是具体 class。示例如下:

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

public class XElem : IElem ...

public void InsertIntoBaseElemList(ref List<IElem> List, IElem Element)