我们经常使用系统自带的List<T>来操作集合对象,那么我们如何根据业务需求灵活制定自己的泛型对象呢?
一、定义要存储的数据类型
Person类
public class Person
{
public string Name
{
get;
set;
}
public string Sex
{
get;
set;
}
public Person(string name, string sex)
{
Name = name;
Sex = sex;
}
}
二、自定义PersonCollection<T>泛型类
public class PersonCollection<T>:IEnumerable<T> where T : Person//where字句:约束T的数据类型
{
private List<T> perCol = new List<T>();
public IEnumerator<T> GetEnumerator() //实现接口IEnumerable<T>方法,返回迭代器。如果没有迭代器则无法使用foreach
{
return perCol.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return perCol.GetEnumerator();
}
public void AddPerson(T t)
{
perCol.Add(t);
}
public void ClearPerson()
{
perCol.Clear();
}
public int PersonCount
{
get
{
return perCol.Count;
}
}
}
where字句:
1、对数据类型的约束,如果不使用where字句,则可传入任何数据类型
2、要约束的数据类型必须为非密封类、接口、类型参数
也可以不需要继承IEnumerable<T>接口,只要实现GetEnumerator() 方法即可
public class PersonCollection<T> where T:Person
{
private List<T> perCol = new List<T>();
public IEnumerator<T> GetEnumerator()
{
return perCol.GetEnumerator();
}
public void AddPerson(T t)
{
perCol.Add(t);
}
public void ClearPerson()
{
perCol.Clear();
}
public int PersonCount
{
get
{
return perCol.Count;
}
}
}
测试:
PersonCollection<Person> percol = new PersonCollection<Person>();
percol.AddPerson(new Person("人1", "男"));
percol.AddPerson(new Person("人2", "女"));
foreach (Person per in percol)
Response.Write("<script>alert('姓名:" + per.Name + ",性别:" + per.Sex + "');</script>");