C# 如何将两个列表类型非常相似的方法重构为通用方法?
我有两种非常相似的方法。唯一的区别是C# 如何将两个列表类型非常相似的方法重构为通用方法?,c#,function,generics,methods,refactoring,C#,Function,Generics,Methods,Refactoring,我有两种非常相似的方法。唯一的区别是绑定列表中使用的类型,但我无法为这两种类型创建通用方法。我想我必须使用泛型类型才能让它工作,但我想不出来。这两种类型都有Title属性 private int GetObjectIndexFromTitle(string str, BindingList<MyClass1> list) { foreach (var item in list) { if (item.Title == str) {
绑定列表中使用的类型,但我无法为这两种类型创建通用方法。我想我必须使用泛型类型才能让它工作,但我想不出来。这两种类型都有Title
属性
private int GetObjectIndexFromTitle(string str, BindingList<MyClass1> list)
{
foreach (var item in list)
{
if (item.Title == str)
{
return list.IndexOf(item);
}
}
return -1;
}
private int GetObjectIndexFromTitle(字符串str,BindingList)
{
foreach(列表中的变量项)
{
如果(item.Title==str)
{
返回列表。索引(项目);
}
}
返回-1;
}
这是:
private int GetObjectIndexFromTitle(string str, BindingList<MyClass2> list)
{
foreach (var item in list)
{
if (item.Title == str)
{
return list.IndexOf(item);
}
}
return -1;
}
private int GetObjectIndexFromTitle(字符串str,BindingList)
{
foreach(列表中的变量项)
{
如果(item.Title==str)
{
返回列表。索引(项目);
}
}
返回-1;
}
我已经浏览了泛型类型文档,但由于非常具体的Title
属性,我无法使其正常工作。我希望得到一些帮助。使用以下工具创建界面:
public interface ITitleAware{
string Title { get; }
}
您的类将实现它:
public MyClass1 : ITitleAware {
//code
}
public MyClass2 : ITitleAware {
//code
}
然后:
private int GetObjectIndexFromTitle(字符串str,BindingList)
{
foreach(列表中的变量项)
{
如果(item.Title==str)
{
返回列表。索引(项目);
}
}
返回-1;
}
使用以下内容创建界面:
public interface ITitleAware{
string Title { get; }
}
您的类将实现它:
public MyClass1 : ITitleAware {
//code
}
public MyClass2 : ITitleAware {
//code
}
然后:
private int GetObjectIndexFromTitle(字符串str,BindingList)
{
foreach(列表中的变量项)
{
如果(item.Title==str)
{
返回列表。索引(项目);
}
}
返回-1;
}
公共静态类myClass
{
公共静态int-GetObjectIndexFromTitle(T myList,字符串myString)
{
foreach(myList中的var项)
{
if(item.Title==myString)
{
返回列表。索引(项目);
}
}
返回-1;
}
}
用法:
myClass.GetObjectIndexFromTitle<myClass1>(myList1, "myString1");
myClass.GetObjectIndexFromTitle<myClass222>(myList2222, "myString222");
myClass.GetObjectIndexFromTitle(myList1,“myString”);
myClass.GetObjectIndexFromTitle(myList2222,“myString 222”);
公共静态类myClass
{
公共静态int-GetObjectIndexFromTitle(T myList,字符串myString)
{
foreach(myList中的var项)
{
if(item.Title==myString)
{
返回列表。索引(项目);
}
}
返回-1;
}
}
用法:
myClass.GetObjectIndexFromTitle<myClass1>(myList1, "myString1");
myClass.GetObjectIndexFromTitle<myClass222>(myList2222, "myString222");
myClass.GetObjectIndexFromTitle(myList1,“myString”);
myClass.GetObjectIndexFromTitle(myList2222,“myString 222”);
如果它们都有Title
属性,那么这对于像IHasTitle
这样的公共接口来说是一个很好的例子。如果它们都有Title
属性,那么对于像IHasTitle
这样的公共接口来说就是一个很好的例子。谢谢您的回答。所以我通常的类代码是//code
,对吗?@n00d是的。确保这些类有一个标题,否则代码将无法编译。当我调用GetObjectIndexFromTitle(“string”,MyBindingListClass1)
时,它会给我第二个参数错误<代码>绑定列表无法转换为绑定列表
。@n00dles为什么它是“myClass1”而不是“myClass1”?无论如何,您似乎忘记了将接口添加到类中,即添加“:ITitleAware”。我创建了接口(…add Item>接口
),并将您发布的内容添加到其中。我还使用:ITitleAware
位实现了它。如果你愿意,我会发布所有相关代码。谢谢你的回答。所以我通常的类代码是//code
,对吗?@n00d是的。确保这些类有一个标题,否则代码将无法编译。当我调用GetObjectIndexFromTitle(“string”,MyBindingListClass1)
时,它会给我第二个参数错误<代码>绑定列表无法转换为绑定列表。@n00dles为什么它是“myClass1”而不是“myClass1”?无论如何,您似乎忘记了将接口添加到类中,即添加“:ITitleAware”。我创建了接口(…add Item>接口
),并将您发布的内容添加到其中。我还使用:ITitleAware
位实现了它。如果您愿意,我将发布所有相关代码。这甚至都不会编译。@Kyle您定义了myClass1和myClass222吗。我想不会吧。代码片段是指向正确方向的基准。不,因为GetObjectIndexFromTitle
的实现不需要或不依赖它们。您的方法实现将不起作用,因为如果没有约束,在foreach
循环中尝试使用myList
时会出现编译错误(因为没有任何东西可以保证t
是可枚举的),甚至修复了这个问题,没有任何约束可以保证项
具有标题
属性。这甚至不会编译。@Kyle您定义了myClass1和myClass222吗。我想不会吧。代码片段是指向正确方向的基准。不,因为GetObjectIndexFromTitle
的实现不需要或不依赖它们。您的方法实现将不起作用,因为如果没有约束,在foreach
循环中尝试使用myList
时会出现编译错误(因为没有任何东西可以保证t
是可枚举的),甚至修复了这个问题,没有任何约束可以保证项
具有标题
属性。