定义对象的索引器 以及 实现枚举接口IEnumerable

说明:

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;
        }
    }


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值