using System;
public class Test
{
public static void Main( )
{
Zoo zoo = new Zoo( ) ;
CountingVisitor v = new CountingVisitor( ) ;
zoo.Accept ( v) ;
v.Summary ( ) ;
}
interface AnimalVisitor
{
void Visit( Animal animal) ;
}
interface Animal { }
class Zoo
{
Animal[ ] animals = new Animal[ ]
{
new Giraffe( ) ,
new Zebra( ) ,
new Lion( ) ,
new Penguin( )
} ;
public void Accept( AnimalVisitor visitor)
{
foreach ( var a in animals)
visitor.Visit ( a) ;
}
}
class Giraffe : Animal { }
class Zebra : Animal { }
class Lion : Animal { }
class Penguin : Animal { }
class CountingVisitor : AnimalVisitor
{
int numberOfMammals;
int numberOfBirds;
int numberOfMonochromeAnimals;
public void Summary( )
{
Console.WriteLine ( "Discovered {0} mammals, {1} birds" , numberOfMammals, numberOfBirds) ;
Console.WriteLine ( "Total {0} monochrome animals" , numberOfMonochromeAnimals) ;
}
public void Visit( Animal animal)
{
VisitImpl( ( dynamic) animal) ;
}
void VisitImpl( Giraffe giraffe)
{
numberOfMammals++;
}
void VisitImpl( Zebra zebra)
{
numberOfMammals++;
numberOfMonochromeAnimals++;
}
void VisitImpl( Lion lion)
{
numberOfMammals++;
Console.WriteLine ( "Lions are NOT scary" ) ;
}
void VisitImpl( Penguin penguin)
{
numberOfBirds++;
numberOfMonochromeAnimals++;
}
}
}
dXNpbmcgU3lzdGVtOwoKcHVibGljIGNsYXNzIFRlc3QKewogICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQogICAgewogICAgICAgIFpvbyB6b28gPSBuZXcgWm9vKCk7CiAgICAgICAgQ291bnRpbmdWaXNpdG9yIHYgPSBuZXcgQ291bnRpbmdWaXNpdG9yKCk7CiAgICAgICAgem9vLkFjY2VwdCh2KTsKICAgICAgICB2LlN1bW1hcnkoKTsKICAgIH0KICAgIAogICAgaW50ZXJmYWNlIEFuaW1hbFZpc2l0b3IKICAgIHsKICAgICAgICB2b2lkIFZpc2l0KEFuaW1hbCBhbmltYWwpOwogICAgfQogICAgCiAgICBpbnRlcmZhY2UgQW5pbWFsIHt9CiAgICAKICAgIGNsYXNzIFpvbwogICAgewogICAgICAgIEFuaW1hbFtdIGFuaW1hbHMgPSBuZXcgQW5pbWFsW10KICAgICAgICB7CiAgICAgICAgICAgIG5ldyBHaXJhZmZlKCksCiAgICAgICAgICAgIG5ldyBaZWJyYSgpLAogICAgICAgICAgICBuZXcgTGlvbigpLAogICAgICAgICAgICBuZXcgUGVuZ3VpbigpCiAgICAgICAgfTsKICAgICAgICAKICAgICAgICBwdWJsaWMgdm9pZCBBY2NlcHQoQW5pbWFsVmlzaXRvciB2aXNpdG9yKQogICAgICAgIHsKICAgICAgICAgICAgZm9yZWFjaCAodmFyIGEgaW4gYW5pbWFscykKICAgICAgICAgICAgICAgIHZpc2l0b3IuVmlzaXQoYSk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBjbGFzcyBHaXJhZmZlIDogQW5pbWFsIHt9CiAgICBjbGFzcyBaZWJyYSA6IEFuaW1hbCB7fSAgICAKICAgIGNsYXNzIExpb24gOiBBbmltYWwge30KICAgIGNsYXNzIFBlbmd1aW4gOiBBbmltYWwge30KICAgIAogICAgY2xhc3MgQ291bnRpbmdWaXNpdG9yIDogQW5pbWFsVmlzaXRvcgogICAgewogICAgICAgIGludCBudW1iZXJPZk1hbW1hbHM7CiAgICAgICAgaW50IG51bWJlck9mQmlyZHM7CiAgICAgICAgaW50IG51bWJlck9mTW9ub2Nocm9tZUFuaW1hbHM7CiAgICAgICAgcHVibGljIHZvaWQgU3VtbWFyeSgpCiAgICAgICAgewogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRGlzY292ZXJlZCB7MH0gbWFtbWFscywgezF9IGJpcmRzIiwgbnVtYmVyT2ZNYW1tYWxzLCBudW1iZXJPZkJpcmRzKTsKICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlRvdGFsIHswfSBtb25vY2hyb21lIGFuaW1hbHMiLCBudW1iZXJPZk1vbm9jaHJvbWVBbmltYWxzKTsKICAgICAgICB9CiAgICAgICAgcHVibGljIHZvaWQgVmlzaXQoQW5pbWFsIGFuaW1hbCkKICAgICAgICB7CiAgICAgICAgICAgIFZpc2l0SW1wbCgoZHluYW1pYylhbmltYWwpOwogICAgICAgIH0KICAgICAgICB2b2lkIFZpc2l0SW1wbChHaXJhZmZlIGdpcmFmZmUpCiAgICAgICAgewogICAgICAgICAgICBudW1iZXJPZk1hbW1hbHMrKzsKICAgICAgICB9CiAgICAgICAgdm9pZCBWaXNpdEltcGwoWmVicmEgemVicmEpCiAgICAgICAgewogICAgICAgICAgICBudW1iZXJPZk1hbW1hbHMrKzsKICAgICAgICAgICAgbnVtYmVyT2ZNb25vY2hyb21lQW5pbWFscysrOwogICAgICAgIH0KICAgICAgICB2b2lkIFZpc2l0SW1wbChMaW9uIGxpb24pCiAgICAgICAgewogICAgICAgICAgICBudW1iZXJPZk1hbW1hbHMrKzsKICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkxpb25zIGFyZSBOT1Qgc2NhcnkiKTsKICAgICAgICB9CiAgICAgICAgdm9pZCBWaXNpdEltcGwoUGVuZ3VpbiBwZW5ndWluKQogICAgICAgIHsKICAgICAgICAgICAgbnVtYmVyT2ZCaXJkcysrOwogICAgICAgICAgICBudW1iZXJPZk1vbm9jaHJvbWVBbmltYWxzKys7CiAgICAgICAgfQogICAgfQp9
compilation info
prog.cs(54,24): error CS1980: Dynamic keyword requires `System.Runtime.CompilerServices.DynamicAttribute' to be defined. Are you missing System.Core.dll assembly reference?
prog.cs(54,13): error CS0518: The predefined type `Microsoft.CSharp.RuntimeBinder.Binder' is not defined or imported
prog.cs(54,13): error CS0518: The predefined type `System.Runtime.CompilerServices.CallSite' is not defined or imported
prog.cs(54,13): error CS0518: The predefined type `System.Runtime.CompilerServices.CallSite' is not defined or imported
prog.cs(54,13): error CS1969: Dynamic operation cannot be compiled without `Microsoft.CSharp.dll' assembly reference
Compilation failed: 5 error(s), 0 warnings
stdout