using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using MbUnit.Framework; namespace Spiking35.Test { public class HighSocietyCountryClub : ICountryClub { public HighSocietyCountryClub() { _membersOfTheHighlyExclusiveCountryClub = new List< IExclusiveMember >( ); } public IEnumerable< IExclusiveMember > RosterOfMembers { get { foreach ( IExclusiveMember exclusiveMember in _membersOfTheHighlyExclusiveCountryClub ) { yield return exclusiveMember; } } } //public IEnumerable< IExclusiveMember > RosterOfMembers { // get { return _membersOfTheHighlyExclusiveCountryClub; } //} //public IList< IExclusiveMember > Members { // get { return _membersOfTheHighlyExclusiveCountryClub; } //} private IList< IExclusiveMember > _membersOfTheHighlyExclusiveCountryClub; } public class CountryClubBackDoor { public CountryClubBackDoor() { _club = new HighSocietyCountryClub( ); } public void SneakIn() { IExclusiveMember ruffian = new Ruffian(); //_club.Members.Add( ruffian ); // oops... who let the ruffian in? ( ( List< IExclusiveMember > )_club.RosterOfMembers ).Add( ruffian ); // they did it again! } private ICountryClub _club; } internal class Ruffian : IExclusiveMember {} public interface IExclusiveMember {} public interface ICountryClub { //IList< IExclusiveMember > Members { get; } IEnumerable< IExclusiveMember > RosterOfMembers { get; } } public class ExclusiveMembersEnumerable : IEnumerable< IExclusiveMember > { public ExclusiveMembersEnumerable( IEnumerable< IExclusiveMember > members ) { _members = members; } IEnumerator< IExclusiveMember > IEnumerable< IExclusiveMember >.GetEnumerator() { return _members.GetEnumerator( ); } public IEnumerator GetEnumerator() { return ( ( IEnumerable< IExclusiveMember > )this ).GetEnumerator( ); } private readonly IEnumerable< IExclusiveMember > _members; } [TestFixture] public class HighSocietyCountryClubTest { [Test] public void Lets_check_out_the_rost_of_members_in_the_exclusive_country_club() { ICountryClub countryClub = new HighSocietyCountryClub( ); IEnumerable< IExclusiveMember > rosterOfMembers = countryClub.RosterOfMembers; foreach ( IExclusiveMember exclusiveMember in rosterOfMembers ) { Console.Out.WriteLine( exclusiveMember ); } } } public class HighSocietyMembersQueryable : IQueryable< IExclusiveMember > { IEnumerator< IExclusiveMember > IEnumerable< IExclusiveMember >.GetEnumerator() { throw new NotImplementedException( ); } public IEnumerator GetEnumerator() { return ( ( IEnumerable< IExclusiveMember > )this ).GetEnumerator( ); } public Expression Expression { get { throw new NotImplementedException( ); } } public Type ElementType { get { throw new NotImplementedException( ); } } public IQueryProvider Provider { get { throw new NotImplementedException( ); } } } }