代码出自《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();
}
}
关于访问者模式 反射的内容 以后肯定要更详细的介绍