如果我有一堆FieldInfo
的实例,并且我已经知道它们的FieldType
是可以传递给BinaryWriter.Write(...)
的类型之一,我如何自动将给定对象的字段传递给BinaryWriter.Write(...)
,而不需要针对一组类型测试FieldType
并手动转换为匹配的类型?
。如何避免做以下事情:
object value = fieldInfo.GetValue(foo);
if (fieldInfo.FieldType == typeof(int))
{
binaryWriter.Write((int)value);
}
// followed by an `else if` for each other type.
更新:
应该说,我想针对。net 2.0做这件事,最好不要使用c# 3.0中没有的东西。
如果你使用的是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);
您需要使用反射调用Write
以在运行时而不是编译时找到正确的过载:
typeof(BinaryWriter).InvokeMember(
"Write",
BindingFlags.InvokeMethod,
null,
binaryWriter,
new object[] { value }
);
如果你使用c# 4,你也可以使用dynamic
:
binaryWriter.Write((dynamic)value);
动态关键字将在这里工作
binaryWriter.Write((dynamic)value);