使用通用参数创建方法

时间:2015-01-05 14:46:08

标签: c# generics types

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

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类型的列表中,我必须复制此方法并更改参数类型。

是否有可能编写一个可以处理多种类型作为参数的方法,gaiganies参数1和参数2属于同一类型?
我读到了Generic Types,但我无法让它工作......

4 个答案:

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

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

答案 1 :(得分: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的界面,由XElemYElem实施。
如果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);
}

答案 2 :(得分:1)

试试这个:

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

假设XElem和YElem继承自BaseElem

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