Если вы используете C # 4, самый простой подход - использовать динамическую типизацию и позволить этому разобраться:
dynamic value = fieldInfo.GetValue(foo);
binaryWriter.Write(value);
Это предполагает, что вы всегда просто хотите вызвать перегрузку binaryWriter.Write
,Другая альтернатива - иметь словарь от типа значения до «что с ним делать»:
static readonly Dictionary<Type, Action<object, BinaryWriter>> Actions =
new Dictionary<Type, Action<object, BinaryWriter>>
{
{ typeof(int), (value, writer) => writer.Write((int) value) },
{ typeof(string), (value, writer) => writer.Write((string) value) },
// etc
};
Тогда:
object value = fieldInfo.GetValue(foo);
Actions[value.GetType()](value, binaryWriter);