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数据.我有一个单一类型的工作.
您需要使用以下语法来定义方法.
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)
可能是灵魂是提取界面?
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)
我会创建一个包含所有相关属性的接口,例如
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>
交换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;
}
}
Run Code Online (Sandbox Code Playgroud)
提取超类或创建接口,然后你可以这样做:
private void IEnumerable<T> SwapFirstAndLastNames(IEnumerable<T> persons) where T : PersonSuperClass
{
...
}
Run Code Online (Sandbox Code Playgroud)