C#使用反射特性构建访问者模式

简介: 代码出自《c#3.0设计模式》两个结构的对象 class Element { public Element Next { get; set; } public Element Part { get; set; } publi...

代码出自《c#3.0设计模式》

两个结构的对象

    class Element
    {
        public Element Next { get; set; }
        public Element Part { get; set; }
        public Element() { }
        public Element(Element next)
        {
            Next = next;
        }
    }
    class ElementWithLink : Element
    {
        public ElementWithLink(Element part, Element next)
        {
            Next = next;
            Part = part;
        }
    }



与反射相关的核心代码

    abstract class IVisitor
    {
        public void ReflectiveVisit(Element element)
        {
            Type[] types = new Type[]{element.GetType()};
            //搜索参数与指定参数类型匹配的指定公共方法
            //第一个参数是方法名称
            //第二个参数为参数对象的数组,顺序和类型必须一致
            MethodInfo methodinfo = this.GetType().GetMethod("Visit", types);
            if (methodinfo != null)
            {
                //使用指定的参数调用当前实例所表示的方法或构造函数
                //第一个参数是被调用方法的对象的实例
                //第二个参数是该方法的参数,顺序和类型都必须一致
                methodinfo.Invoke(this, new object[] { element });
            }
            else
            {
                Console.WriteLine("Unexpected Visit");
            }
        }
    }


如果不懂请看注释

访问器

    class CountVisitor : IVisitor
    {
        public int Count { get; set; }
        public void CountElements(Element element)
        {
            ReflectiveVisit(element);
            if (element.Part != null)
            {
                CountElements(element.Part);
            }
            if (element.Next != null)
            {
                CountElements(element.Next);
            }
        }
        public void Visit(ElementWithLink element)
        {
            Console.WriteLine("not counting");
        }
        public void Visit(Element element)
        {
            Count++;
        }
    }



客户端代码

    class Program
    {
        static void Main(string[] args)
        {
            Element objectStructure = new Element(
                                        new Element(
                                            new ElementWithLink(
                                                new Element(
                                                    new Element(
                                                        new ElementWithLink(
                                                            new Element(null),new Element(null)
                                                        ))),
                                                        new Element(
                                                            new Element(
                                                                new Element(null)
                                                                )))));
            Console.WriteLine("count it");
            CountVisitor visitor = new CountVisitor();
            visitor.CountElements(objectStructure);
            Console.WriteLine(visitor.Count);
            Console.ReadKey();
        }
    }


关于访问者模式    反射的内容
以后肯定要更详细的介绍

目录
相关文章
|
22天前
|
程序员 C# 数据库
C# 比较对象新思路,利用反射技术打造更灵活的比较工具
中途接手的项目,碰到需要在更新对象信息时比较并记录差异的需求,最变态的还有附加要求,怎么办?有没有既能满足需求又能对项目影响最小的方法呢?分享这个我封装的方法,一个利用反射技术打造的更灵活的比较工具
|
2月前
|
编译器 C# 开发者
C# 9.0 新特性解析
C# 9.0 是微软在2020年11月随.NET 5.0发布的重大更新,带来了一系列新特性和改进,如记录类型、初始化器增强、顶级语句、模式匹配增强、目标类型的新表达式、属性模式和空值处理操作符等,旨在提升开发效率和代码可读性。本文将详细介绍这些新特性,并提供代码示例和常见问题解答。
62 7
C# 9.0 新特性解析
|
4月前
|
编译器 C# Android开发
震惊!Uno Platform 与 C# 最新特性的完美融合,你不可不知的跨平台开发秘籍!
Uno Platform 是一个强大的跨平台应用开发框架,支持 Windows、macOS、iOS、Android 和 WebAssembly,采用 C# 和 XAML 进行编程。C# 作为其核心语言,持续推出新特性,如可空引用类型、异步流、记录类型和顶级语句等,极大地提升了开发效率。要在 Uno Platform 中使用最新 C# 特性,需确保开发环境支持相应版本,并正确配置编译器选项。通过示例展示了如何在 Uno Platform 中应用可空引用类型、异步流、记录类型及顶级语句等功能,帮助开发者更好地构建高效、优质的跨平台应用。
263 59
|
2月前
|
C# 开发者
C# 10.0 新特性解析
C# 10.0 在性能、可读性和开发效率方面进行了多项增强。本文介绍了文件范围的命名空间、记录结构体、只读结构体、局部函数的递归优化、改进的模式匹配和 lambda 表达式等新特性,并通过代码示例帮助理解这些特性。
48 2
|
3月前
|
JSON C# 开发者
C#语言新特性深度剖析:提升你的.NET开发效率
【10月更文挑战第15天】C#语言凭借其强大的功能和易用性深受开发者喜爱。随着.NET平台的演进,C#不断引入新特性,如C# 7.0的模式匹配和C# 8.0的异步流,显著提升了开发效率和代码可维护性。本文将深入探讨这些新特性,助力开发者在.NET开发中更高效地利用它们。
51 1
|
4月前
|
编译器 C# Android开发
Uno Platform 是一个用于构建跨平台应用程序的强大框架,它允许开发者使用 C# 和 XAML 来创建适用于多个平台的应用
Uno Platform 是一个用于构建跨平台应用程序的强大框架,它允许开发者使用 C# 和 XAML 来创建适用于多个平台的应用
408 8
|
5月前
|
开发框架 .NET 编译器
总结一下 C# 如何自定义特性 Attribute 并进行应用
总结一下 C# 如何自定义特性 Attribute 并进行应用
150 1
|
5月前
|
Android开发 iOS开发 C#
Xamarin:用C#打造跨平台移动应用的终极利器——从零开始构建你的第一个iOS与Android通用App,体验前所未有的高效与便捷开发之旅
【8月更文挑战第31天】Xamarin 是一个强大的框架,允许开发者使用单一的 C# 代码库构建高性能的原生移动应用,支持 iOS、Android 和 Windows 平台。作为微软的一部分,Xamarin 充分利用了 .NET 框架的强大功能,提供了丰富的 API 和工具集,简化了跨平台移动应用开发。本文通过一个简单的示例应用介绍了如何使用 Xamarin.Forms 快速创建跨平台应用,包括设置开发环境、定义用户界面和实现按钮点击事件处理逻辑。这个示例展示了 Xamarin.Forms 的基本功能,帮助开发者提高开发效率并实现一致的用户体验。
212 0
|
5月前
|
Android开发 iOS开发 C#
Xamarin.Forms:从零开始的快速入门指南——打造你的首个跨平台移动应用,轻松学会用C#和XAML构建iOS与Android通用界面的每一个步骤
【8月更文挑战第31天】Xamarin.Forms 是一个强大的框架,让开发者通过单一共享代码库构建跨平台移动应用,支持 iOS、Android 和 Windows。使用 C# 和 XAML,它简化了多平台开发流程并保持一致的用户体验。本指南通过创建一个简单的 “HelloXamarin” 应用演示了 Xamarin.Forms 的基本功能和工作原理。
138 0
|
5月前
|
数据安全/隐私保护 C# UED
利用 Xamarin 开展企业级移动应用开发:从用户登录到客户管理,全面演示C#与Xamarin.Forms构建跨平台CRM应用的实战技巧与代码示例
【8月更文挑战第31天】利用 Xamarin 进行企业级移动应用开发能显著提升效率并确保高质量和高性能。Xamarin 的跨平台特性使得开发者可以通过单一的 C# 代码库构建 iOS、Android 和 Windows 应用,帮助企业快速推出产品并保持一致的用户体验。本文通过一个简单的 CRM 示例应用演示 Xamarin 的使用方法,并提供了具体的代码示例。该应用包括用户登录、客户列表显示和添加新客户等功能。此外,还介绍了如何增强应用的安全性、数据持久化、性能优化及可扩展性,从而构建出功能全面且体验良好的移动应用。
66 0