Если вы хотите упростить это, вы можете использовать выражение для динамического правильного вызова.
//Cache the generated method for re-use later, say as a static field of dictionary. It shouldn't grow too-big given the number of overloads of Write.
private static Dictionary<Type, Action<BinaryWriter, object>> _lambdaCache = new Dictionary<Type, Action<BinaryWriter, object>>();
//...
if (!_lambdaCache.ContainsKey(fi.FieldType))
{
var binaryWriterParameter = Expression.Parameter(typeof(BinaryWriter));
var valueParameter = Expression.Parameter(typeof(object));
var call = Expression.Call(binaryWriterParameter, "Write", null, Expression.Convert(valueParameter, fi.FieldType));
var lambda = Expression.Lambda<Action<BinaryWriter, object>>(call, binaryWriterParameter, valueParameter).Compile();
_lambdaCache.Add(fi.FieldType, lambda);
}
var write = _lambdaCache[fi.FieldType];
write(bw, fi.GetValue(obj));
То, что мы здесь делаем, - это динамическая генерация кода для вызова того, что вам нужно для бинарной записи. Это звучит сложнее, чем на самом деле, но мы создаем выражение для метода «Write» BinaryWriter
. Мы также динамически приводим его с использованием Expression.Convert
, поэтому вызывается правильная перегрузка Write
. Мы берем два параметра BinaryWriter и значение для записи. Наконец, мы компилируем лямбду и кешируем ее для этого типа для последующего использования.
В зависимости от ваших потребностей, это будет намного быстрее, чем использование отражения над BinaryWriter
.