double dispatch pattern c#