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


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

目录
相关文章
|
1月前
|
C#
C#学习相关系列之数据类型类的三大特性(二)
C#学习相关系列之数据类型类的三大特性(二)
|
1月前
|
编译器 C# 开发者
C# 11.0中的新特性:覆盖默认接口方法
C# 11.0进一步增强了接口的灵活性,引入了覆盖默认接口方法的能力。这一新特性允许类在实现接口时,不仅可以提供接口中未实现的方法的具体实现,还可以覆盖接口中定义的默认方法实现。本文将详细介绍C# 11.0中接口默认方法覆盖的工作原理、使用场景及其对现有代码的影响,帮助开发者更好地理解和应用这一新功能。
|
1月前
|
编译器 C# 开发者
C# 9.0中的顶级语句:简化程序入口的新特性
【1月更文挑战第13天】本文介绍了C# 9.0中引入的顶级语句(Top-level statements)特性,该特性允许开发者在不使用传统的类和方法结构的情况下编写简洁的程序入口代码。文章详细阐述了顶级语句的语法、使用场景以及与传统程序结构的区别,并通过示例代码展示了其在实际应用中的便捷性。
|
1月前
|
API C# 数据库
C#反射详解
C#反射详解
13 0
|
1月前
|
开发框架 .NET Java
ASP.NET Core高级编程--C#基本特性(一)
本文章简略介绍C#的部分特性
|
1月前
|
设计模式 C#
C#反射机制实现开闭原则的简单工厂模式
C#反射机制实现开闭原则的简单工厂模式
29 0
|
1月前
|
存储 C# 开发者
C# | 通过反射将对象属性展示在TreeView中
在编程过程中,我们经常需要处理复杂的对象和数据结构。将这些数据结构展示在UI界面上是很有用的,可以帮助开发者更好地理解和分析数据。 而TreeView作为一种常见的控件,可以以树状结构的方式展示数据,非常适合用于展示层次化的对象。 本文将介绍如何使用TreeView控件展示一个对象,并且可以动态处理对象中的属性和子对象。通过本文的学习,您将学会如何更好地理解和展示数据,提高编程效率。
45 0
C# | 通过反射将对象属性展示在TreeView中
|
6月前
|
安全 C# 图形学
C#的反射机制
C#的反射机制
|
7月前
|
C#
c#之Attribute特性的原理
c#之Attribute特性的原理
26 0
|
7月前
|
存储 Java API
C#反射(Reflection)详解
反射是.NET中的重要机制,通过反射可以得到*.exe或*.dll等程序集内部的接口、类、方法、字段、属性、特性等信息,还可以动态创建出类型实例并执行其中的方法。反射指程序可以访问、检测和修改它本身状态或行为的一种能力。通俗一点:我们在获取其他实体类的字段名或实列,只能获取公有的,而有了反射之后可以获取私有的,可以获取他的基类等等,可以说把家底查得清清楚楚。
37 1