簡體   English   中英

創建一個采用泛型類型的IEnumerable類型的方法

[英]Creating a method of IEnumerable type that takes in generic type

我創建了一個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;}
    }

我有以下內容:

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);

使用上面的方法我得到一個錯誤,該方法說“無法從ProjectPerson轉換為IPerson(與Person轉換為IPerson)”以及“SwapFirstAndLastNames(IEnumerable)的最佳重載方法匹配具有一些無效參數。

person和projectPerson都是IENumerable類型(帶下划線的那些),並且每個中使用的數據在別處用於填充數據網格等。 所以我基本上尋找一個采用任何類型的IEnumerable的方法,交換IEnumerable.Name字段(我已經有代碼執行此操作),然后返回交換的IEnumerable數據。 我有一個單一類型的工作。

您需要使用以下語法來定義方法。

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;}
}

可能是靈魂是提取界面

  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;
  }

我會創建一個包含所有相關屬性的接口,例如

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;
    }
}

提取超類或make界面,然后你可以這樣做:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM