c#扩展方法(this) 迭代器

学生类:

复制代码
 /// <summary>
    /// 学生实体
    /// </summary>
    public class Student
    {
        public int Id { get; set; }
        public int ClassId { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }

        public void Study()
        {
            Console.WriteLine("{0} {1}跟着Richard老师学习.net高级开发", this.Id, this.Name);
        }

        public void StudyHard()
        {
            Console.WriteLine("{0} {1}跟着Richard老师努力学习.net高级开发", this.Id, this.Name);
        }

    }
复制代码

 

调用:

                  Student student = new Student()
                    {
                        Id = 1,
                        Name = "Mr.zhang",
                        Age = 25,
                        ClassId = 2
                    };
                    student.Study();

 

之后如果在学生类再加一个方法,正常的情况下是直接在学生类中做修改,但是如果为了遵循开闭原则的话可以做一个扩展方法:

复制代码
    public static class ExtendMethod
    {  /// <summary>
        /// 扩展方法:添加一个第三方静态类,把当前需要扩展的类作为参数添加方法,在第一个参数前加一个this
        /// </summary>
        /// <param name="student"></param>
        public static void StudyPractise(this Student student)
        {
            Console.WriteLine("{0} {1}跟着Richard老师学习基础班!", student.Id, student.Name);
        } 
    }
复制代码

 

调用:

   student.StudyPractise(); //扩展方法;看起来跟实例方法调用方式一样

 

还可以对object的扩展方法:

复制代码
        /// <summary>
        /// 自定义的扩展方法
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static string ObjTostringCustom(this object obj)// 默认参数
        {
            if (obj is Guid)
            {
                return obj.ToString();
            }
            ///.....
            else
            {
                return obj.ToString();
            }
        }
复制代码

 

但是需要注意的是,使用object类型容易污染,因为没有类型限制,只要是继承于object的类型都能调用。

对泛型的扩展示例

复制代码
      public static string GenericExtend<T>(this T t)// 默认参数
        {
            if (t is Guid)
            {
                return t.ToString();
            }
            ///.....
            else
            {
                return t.ToString();
            }
        }
复制代码

 

迭代器

通过yield+IEnumerable能够实现按需获取,延迟加载。

看下面的代码:

复制代码
        /// <summary>
        /// 迭代器 (迭代器模式)
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="resource"></param>
        /// <param name="func"></param>
        /// <returns></returns>
        public static IEnumerable<T> JerryWhereIterator<T>(this IEnumerable<T> resource, Func<T, bool> func)
        {
            foreach (var item in resource)
            {
                Console.WriteLine("开始检查");
                Thread.Sleep(300);
                if (func.Invoke(item))
                {
                    yield return item; // yield 和Enumerabl 是配合使用,按需获取/延时加载
                }
            }

        }
复制代码

 

调用:

                var list3 = studentList.JerryWhereIterator(a => a.Age < 30);
                foreach (var item in list3)
                {
                    Console.WriteLine(item.Name);
                }

 

在调用的时候,只有在foreach遍历的时候才会真正的调用JerryWhereIterator内部的代码,每一次遍历都会走一次下面的代码:

复制代码
         foreach (var item in resource)
            {
                Console.WriteLine("开始检查");
                Thread.Sleep(300);
                if (func.Invoke(item))
                {
                    yield return item; // yield 和Enumerabl 是配合使用,按需获取/延时加载
                }
            }
复制代码

 

只要有一条符合,就返回。如果是普通的那种List,就是需要全部处理完才会返回。

 

posted @   安静点--  阅读(79)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示