Если заранее неизвестно, каких типов будут элементы, и при этом их нужно будет экспортировать в какой-то формат, то пишут конвертеры для всех стандартных типов, а для остальных подразумевается, что они должны реализовать какой-то интерфейс.
К примеру, вот так:
protected Dictionary<Type, IExporter> Exporters { get; set; }
public void Export(object value, StreamWriter writer)
{
IExporter exporter = FindExporter(value.GetType());
if (exporter != null)
{
exporter.Export(value, writer);
}
else
{
writer.WriteString(value.ToString());
}
}
private IExporter FindExporter(Type type)
{
IExporter exporter = null;
if(Exporters.ContainsKey(type))
{
exporter = Exporters[type];
}
else
{
if(typeof(IMyFormatExportable).IsAssignableFrom(type))
{
exporter = new ExportAwareExporter(type);
}
}
return exporter;
}
И для своих классов, которые хотите экспортировать вручную, реализовываете такой интерфейс:
public interface IMyFormatExportable
{
void Export(StreamWriter writer);
}
public MyClass : IMyFormatExportable
{
// ...
void Export(StreamWriter writer)
{
// writer.Write...(...);
}
}