使用泛型参数创建方法
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
并由XElem
和YElem
实现。
如果 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)
这段代码是我写的(只有第一行很重要):
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
并由XElem
和YElem
实现。
如果 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)