//A sample consumer of the game's API class Program { static void Main(string[] args) { Collection sprites = new Collection(); sprites.Add(SpriteManager.AddSprite()); sprites.Add(SpriteManager.AddSprite()); foreach (SpriteHandle handle in sprites) { Console.WriteLine(handle.Sprite.ToString()); } Console.ReadKey(); } } //in a separate assembly which defines the game's API public class Sprite { public SpriteHandle Handle; internal Sprite() { } public override string ToString() { return "Sprite: " + Handle.Index.ToString(); } } public struct SpriteHandle { internal int Index; internal SpriteHandle(int index) { Index = index; } public Sprite Sprite { get { return SpriteManager.Find(this); } } } public static class SpriteManager { private static List _sprites = new List(); public static SpriteHandle AddSprite() { Sprite sprite = new Sprite(); sprite.Handle.Index = _sprites.Count; _sprites.Insert( sprite.Handle.Index, sprite); return sprite.Handle; } public static Sprite Find(SpriteHandle handle) { return _sprites[handle.Index]; } }