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

2022-05-09 11:04:26 浏览数 (1)

代码出自《c#3.0设计模式》 两个结构的对象

代码语言:javascript复制
    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;
        }
    }

与反射相关的核心代码

代码语言:javascript复制
    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");
            }
        }
    }

如果不懂请看注释 访问器

代码语言:javascript复制
    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  ;
        }
    }

客户端代码

代码语言:javascript复制
    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();
        }
    }

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

0 人点赞