using System; using System.Collections.Generic; using System.IO; public class Test { public static void Main() { List wrappers = new List(); wrappers.Add(new Wrapper()); wrappers.Add(new Wrapper()); wrappers.Add(new Wrapper()); var visitor = new SerializationVisitor();//Create the operation you need to apply foreach (var wrapper in wrappers) { wrapper.Accept(visitor); } } } public class Matrix { public T Obj { get; set; } } public interface INonGenericWrapper { void Wrap(); void Accept(IVisitor visitor); } public class Wrapper : INonGenericWrapper { public Matrix Matrix { get; private set; } public void Wrap() { //Your domain specific method } public void Accept(IVisitor visitor) { visitor.Visit(this); } } public interface IVisitor { void Visit(T element); } public class SerializationVisitor : IVisitor { public void Visit(T element) { new Serializer().Serialize(element); } } public class Serializer { public Stream Serialize(T objectToSerialize) { Console.WriteLine("Serializing {0}", objectToSerialize); //Your serialization logic here return null; } }