说明:
1、定义了对象索引器之后,就可以使用索引的方法得到对象中的某个属性 如 person[0] person并不是数组也不是集合,只是我们将他里面的属性封装成数组或集合,然后通过公开这个数组或集合来让外部使用者调用
2、实现了IEnumerable接口的类 可以被foreach历遍。它的本质也是将一个对象的属性封装成一个数组或集合。因为只有数组或集合才是可被枚举的。
代码实现:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
initForm();
}
private void initForm()
{//窗体初始化
Person per = new Person("aa", "bb", 300, 22);
//通过索引器来访问对象的某一个属性
string name = per[0].ToString();
List<string> li = new List<string>();
//通过foreach来历遍这个对象中的所有属性
foreach (var item in per)
{
li.Add(item.ToString());
}
}
}
/// <summary>
/// 这里继承的IEnumerable是一个声明接口,声明它可以被枚举,它必须包含一个返回IEnumerator接口的方法。
/// 所以真正实现枚举功能代码的是 枚举器:IEnumerator
/// </summary>
public class Person : IEnumerable
{
public string Name { get; set; }
public int Age { get;private set; }
public string Sex { get; set; }
public int Money { get; set; }
//********** 实现索引器 ********
//这里的返回类型要和下面的数组类型一致 private object[] persons; 然后加上this关键字
//之后就可以将这个对象的属性变成一个集合一样来操作它。如person[1] 对应的是person的属性Age
public object this[int index]
{
get { return persons[index]; }
set { persons[index] = value; }
}
private object[] persons;
public Person(string name, string sex, int age, int money)
{
Name = name;
Age = age;
Sex = sex;
Money = money;
//这里数组赋值的顺序很重要,它注定了在使用索引器时通过索引而返回哪个属性值。它也注定了在使用枚举器时枚举集合中元素的顺序
persons = new object[4];
persons[0] = Name;
persons[1] = Sex;
persons[2] = Age;
persons[3] = Money;
}
//********** 实现IEnumerator
public IEnumerator GetEnumerator()
{//返回IEnumerable接口
return (IEnumerator)new Persontor(persons);
}
}
//***********这里才是真正的枚举器实现代码
//说明:实现这个接口必须实现三个方法:Current(这是属性) MoveNext() Reset()
//Current 是一个属性,用于返回集合中的当前对象
//MoveNext()是枚举器要调用的下一个索引值。每次枚举器调用这个方法时索引值自动加1,当索引值小于集合最大值是返回true,否则返回false;
//Reset() 是枚举器返回false后,再次想调用MoveNext()的时候 必须重置的索引值,一般都是-1
//你可以在MoveNext()方法中,控制index的值进而控制返回的对象。比如在10个元素构成的集合中,只返回奇数索引的元素 或只返回偶数索引的元素等
public class Persontor : IEnumerator
{
object[] persons;
int index = -1;
public Persontor(object[] persons)
{
this.persons = persons;
}
public object Current
{
get { return persons[index]; }
}
public bool MoveNext()
{
index++;
return index < persons.Length ? true : false;
}
public void Reset()
{
index = -1;
}
}