创建一个采用泛型类型的IEnumerable类型的方法

时间:2014-01-14 09:00:03

标签: c# generics ienumerable

我创建了一个IEnumerable方法,它接受了一个类型为PERSON的IEnumerable,它交换了员工的名字和姓氏(他们当前正在将它们添加到一个字段中的数据库中(" John Smith" ," Craig Robertson")等。

我有另一个名为ProjectPerson的IEnumerable,它有类似但不同的数据,我想交换它们的名字和姓氏。

IEnumerables都有&#34; Name&#34;作为一个字段,所以代码适用于两者,我只是希望能够重用这个代码,而不用IEnumerabe<Person>和另一个IEnumerable<ProjectPerson>创建重载但每个内部都有相同的代码。

有没有办法设置可以被不同类型使用的IEnumerable方法?也许传入Type作为参数然后投射?

我创建了一个名为IPerson的界面:

    public interface IPerson
    {
        string Name { get; set;}
    }

我有以下内容:

public class Person: IPerson {..}

public class ProjectPerson: IPerson {..}

我的方法如下:

private void IEnumerable<IPerson> SwapFirstAndLastNames(IEnumerable<IPerson> persons)
{
    foreach (var employee in persons)
    {
        //do the swapping
    }
    return persons;
}

我使用这两行在类的其他地方调用此方法:

_projectPerson = SwapFirstAndLastNames(projectpersons) 

_person = SwapFirstAndLastNames(person);

使用上面的方法我得到一个错误,说明&#34;无法从ProjectPerson转换为IPerson(与Person转换为IPerson)以及&#34; SwapFirstAndLastNames(IEnumerable)的最佳重载方法匹配有一些无效参数。

person和projectPerson都是IENumerable类型(带下划线的那些),并且每个中使用的数据在别处用于填充datagrids等。因此,我基本上寻找一种采用任何类型的IEnumerable的方法,交换IEnumerable.Name字段(我已经得到了代码来执行此操作),然后返回交换的IEnumerable数据。我有一个单一的类型。

4 个答案:

答案 0 :(得分:5)

您需要使用以下语法来定义方法。

private void IEnumerable<T> SwapFirstAndLastNames(IEnumerable<T> persons) where T : IPerson
{
    foreach (var employee in persons)
    {
       //do the 
    }
    return persons;
}

注意where T : IPerson这会约束你的方法,所以它只能由实现这个接口的类调用(例如,你不希望有人传递ints!)。您将实现此接口,ProjectPerson和Person都包含您的方法需要运行的所有字段(可能是firstname / lastname)。

界面看起来像

public interface IPerson
{
  Firstname {get;set;}
  Lastname {get;set;}
}

答案 1 :(得分:5)

可能解决方法是提取接口

  public interface IPerson {
    String FirstName {get; set}
    String LastName {get; set}
  }

  public class Person: IPerson {...}

  public class ProjectPerson: IPerson {...}

  private void IEnumerable<T> SwapFirstAndLastNames(IEnumerable<T> persons) 
    where T: IPerson
  {
    foreach (var employee in persons)
    {
        // You can operate with FirstName/LastName as you like here 
    }
    return persons;
  }

答案 2 :(得分:5)

我会创建一个包含所有相关属性的界面,例如

public interface INamedEntity
{
    string FirstName { get; set; }
    string LastName { get; set; }
}

你的两个课程都应该实现它:

public class Person : INamedEntity
{
    public string FirstName { get; set; }
    public string LastName { get; set; }         
}

public class ProjectPerson : INamedEntity
{
    public string FirstName { get; set; }
    public string LastName { get; set; } 
}

现在,您可以为IEnumerable<INamedEntity>创建一个扩展方法来交换FirstNameLastname,您可以将其用于PersonsProjectPersons

public static void SwapFirstAndLastNames(this IEnumerable<INamedEntity> persons)
{
    foreach (var person in persons)
    {
        string oldLastName = person.LastName;
        person.LastName = person.FirstName;
        person.FirstName = oldLastName;
    }
}

答案 3 :(得分:1)

提取超类或创建界面,然后你可以这样做:

private void IEnumerable<T> SwapFirstAndLastNames(IEnumerable<T> persons) where T : PersonSuperClass
{ 
... 
}