是否可以使此方法通用

时间:2015-04-03 05:03:33

标签: c# generics

我有一个实现某些接口的类:

public interface IMyInterface
{  
    string GetKey();
    void SetData(List<int> data);
}

public class A : IMyInterface { .. }
public class B : IMyInterface { .. }

我有一个方法可以获取这些类的集合并做同样的事情:

public void methodA(List<A> items)
{
    foreach(var item in items)
    {     
         // do something with A.GetKey();
         // do something with A.SetData();
    }
}

public void methodB(List<B> items)
{
    foreach(var item in items)
    {     
         // do something with B.GetKey();
         // do something with B.SetData();
    }
}

我想将此方法设为通用:

public GenericMethod<T>(T items) where T: IEnumerable
{
    for(var item in items)
    {
        // how can I get the item.GetKey();
    }
}

如何向编译器说T:Inumerable的元素实现IMyInterface并使用方法GetKey()?

2 个答案:

答案 0 :(得分:6)

你可以这样做:

public void GenericMethod<T>(IEnumerable<T> items)
    where T : IMyInterface
{
    for(var item in items)
    {
       // how can I get the item.GetKey();
    }
}

虽然在目前的情况下你并不需要使用仿制药:

public void GenericMethod(IEnumerable<IMyInterface> items)
{
    for(var item in items)
    {
       // how can I get the item.GetKey();
    }
}

答案 1 :(得分:4)

您可以制定约束:where T: IEnumerable<IMyInterface>

但是你甚至不需要它,只能让你的参数成为IEnumerable<T> ...

或者,如果您只需要IMyInterface,则可以完全避免使用泛型并传递IEnumerable<IMyInterface>参数

顺便说一下:你的语法都错了

使用所有三种方法

Here's a fiddle