我写了这段代码(只有第一行很重要):
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,但我无法让它工作......
答案 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
的界面,由XElem
和YElem
实施。
如果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)