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

ian*_*982 5 c# generics ienumerable

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

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

IEnumerables都有"Name"作为字段,因此代码适用于两者,我只是希望能够重新使用此代码而不创建重载,IEnumerabe<Person>而另一个IEnumerable<ProjectPerson>在每个内部使用相同的代码.

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

我创建了一个名为IPerson的接口:

    public interface IPerson
    {
        string Name { get; set;}
    }
Run Code Online (Sandbox Code Playgroud)

我有以下内容:

public class Person: IPerson {..}

public class ProjectPerson: IPerson {..}
Run Code Online (Sandbox Code Playgroud)

我的方法如下所示:

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

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

_projectPerson = SwapFirstAndLastNames(projectpersons) 

_person = SwapFirstAndLastNames(person);
Run Code Online (Sandbox Code Playgroud)

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

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

Lia*_*ath 5

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

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

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

界面看起来像

public interface IPerson
{
  Firstname {get;set;}
  Lastname {get;set;}
}
Run Code Online (Sandbox Code Playgroud)


Dmi*_*nko 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;
  }
Run Code Online (Sandbox Code Playgroud)


Tim*_*ter 5

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

public interface INamedEntity
{
    string FirstName { get; set; }
    string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

你的两个类都应该实现它:

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; } 
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以创建一个扩展方法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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 同意,这里不需要通用 (3认同)

mic*_*ukm 1

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

private void IEnumerable<T> SwapFirstAndLastNames(IEnumerable<T> persons) where T : PersonSuperClass
{ 
... 
}
Run Code Online (Sandbox Code Playgroud)