Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将两个列表类型非常相似的方法重构为通用方法?_C#_Function_Generics_Methods_Refactoring - Fatal编程技术网

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
是可枚举的),甚至修复了这个问题,没有任何约束可以保证
具有
标题
属性。