[英]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>
創建一個擴展方法來交換FirstName
和Lastname
,您可以將它們用於Persons
和ProjectPersons
:
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.