您将需要添加某种标志来让读者知道它是否应该读取下一个字节。
public decimal? ReadNullableDecimal()
{
bool hasValue = ReadBoolean();
if (hasValue) return ReadDecimal();
return null;
}
public void Write(decimal? val)
{
bool hasValue = val.HasValue;
Write(hasValue)
if(hasValue)
Write(val.Value);
}
但是我们可以很聪明地创建一个适用于所有基于结构的类型的通用方法
public Nullable<T> ReadNullable<T>(Func<T> ReadDelegate) where T : struct
{
bool hasValue = ReadBoolean();
if (hasValue) return ReadDelegate();
return null;
}
public void Write<T>(Nullable<T> val) where T : struct
{
bool hasValue = val.HasValue;
Write(hasValue)
if(hasValue)
Write(val.Value);
}
如果我想使用我的ReadNullable
函数来读取 aInt32
我会这样称呼它
Int32? nullableInt = customBinaryReader.ReadNullable(customBinaryReader.ReadInt32);
所以它会测试该值是否存在,如果存在,它将调用传入的函数。
编辑:在上面睡觉后,该Write<T>
方法可能无法像您期望的那样工作。因为T
不是一个定义明确的类型,所以唯一可以支持它的方法是Write(object)
Binary writer 不支持开箱即用。ReadNullable<T>
仍然可以工作,如果你想使用仍然使用Write<T>
,你需要制作val.Value
动态的结果。您需要进行基准测试以查看是否存在任何性能问题。
public void Write<T>(Nullable<T> val) where T : struct
{
bool hasValue = val.HasValue;
Write(hasValue)
if(hasValue)
Write((dynamic)val.Value);
}