我创建了一个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数据。我有一个单一的类型。
答案 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>
创建一个扩展方法来交换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;
}
}
答案 3 :(得分:1)
提取超类或创建界面,然后你可以这样做:
private void IEnumerable<T> SwapFirstAndLastNames(IEnumerable<T> persons) where T : PersonSuperClass
{
...
}