c# – 使用反射生成迭代器

c# – 使用反射生成迭代器,第1张

概述我有一个数据类学生,我有一个聚合类学生. Student有两个类型为string的属性:Name和City. 我想要做的是选择使用foreach机制选择要迭代的属性. 我写的代码有效,它也可读,外观漂亮. 主要问题是性能:我使用yield关键字的行可能不是很有效,但问题是多少?这是戏剧性的表现吗? 有没有更好的方法来实现此功能? (补充:我不想让某人修改返回的Student对象,因此所提出的所有L 我有一个数据类学生,我有一个聚合类学生.
Student有两个类型为string的属性:name和City.

我想要做的是选择使用foreach机制选择要迭代的属性.

我写的代码有效,它也可读,外观漂亮.
主要问题是性能:我使用yIEld关键字的行可能不是很有效,但问题是多少?这是戏剧性的表现吗?

有没有更好的方法来实现此功能?
(补充:我不想让某人修改返回的Student对象,因此所提出的所有Linq解决方案都不是很好.为了更清楚,我希望:
属性迭代foreach机制集成学生类和学生列表是只读的.
我怎么能实现这一目标?)

static voID Main(string[] args)    {                   Students students = new Students();        students.AddStudent(new Student { Age = 20,name = "Stud1",City="City1" });        students.AddStudent(new Student { Age = 46,name = "Stud2",City="City2"});        students.AddStudent(new Student { Age = 32,name = "Stud3",City="City3" });        students.AddStudent(new Student { Age = 34,name = "Stud4",City="city4" });        students.PropertyToIterate = eStudentProperty.City;        foreach (string studentCity in students)        {            Console.Writeline(studentcity);        }        students.PropertyToIterate = eStudentProperty.name;        foreach (string studentname in students)        {            Console.Writeline(studentname);        }    }public class Students :IEnumerable<object>{    private List<Student> m_Students = new List<Student>();    private eStudentProperty m_PropertyToIterate = eStudentProperty.name;    public eStudentProperty PropertyToIterate    {        get { return m_PropertyToIterate; }        set { m_PropertyToIterate = value; }    }    public voID AddStudent(Student i_Student)    {        m_Students.Add(i_Student);    }    public IEnumerator<object> GetEnumerator()    {                    for (int i = 0; i < m_Students.Count; ++i)        {            yIEld return (object)m_Students[i].GetType().GetProperty(PropertyToIterate.ToString()).GetValue(m_Students[i],null);        }                }    IEnumerator IEnumerable.GetEnumerator()    {        throw new NotImplementedException();    }}public enum eStudentProperty{    name,Age,City} public class Student{    public string name { get; set; }    public string City { get; set; }    public int Age { get; set; }}
解决方法 为了回应你的编辑,这样的事情怎么样……

Students students = new Students();students.AddStudent(new Student { Age = 20,City = "City1" });students.AddStudent(new Student { Age = 46,City = "City2" });students.AddStudent(new Student { Age = 32,City = "City3" });students.AddStudent(new Student { Age = 34,City = "city4" });foreach (int studentAge in students.EnumerateBy(StudentProperty.Age)){    Console.Writeline(studentAge);}foreach (string studentname in students.EnumerateBy(StudentProperty.name)){    Console.Writeline(studentname);}foreach (string studentCity in students.EnumerateBy(StudentProperty.City)){    Console.Writeline(studentCity);}// ...public class Students{    private List<Student> _students = new List<Student>();    public voID AddStudent(Student student)    {        _students.Add(student);    }    public IEnumerable<T> EnumerateBy<T>(StudentProperty<T> property)    {        return _students.Select(property.Selector);    }}public static class StudentProperty{    public static Readonly StudentProperty<int> Age =        new StudentProperty<int>(s => s.Age);    public static Readonly StudentProperty<string> name =        new StudentProperty<string>(s => s.name);    public static Readonly StudentProperty<string> City =        new StudentProperty<string>(s => s.City);}public sealed class StudentProperty<T>{    internal Func<Student,T> Selector { get; private set; }    internal StudentProperty(Func<Student,T> selector)    {        Selector = selector;    }}
总结

以上是内存溢出为你收集整理的c# – 使用反射生成迭代器全部内容,希望文章能够帮你解决c# – 使用反射生成迭代器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1226170.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存