如何自动转换从FieldInfo获得的值?将GetValue设置为正确的类型

本文关键字:GetValue 设置 类型 转换 何自动 FieldInfo | 更新日期: 2023-09-27 18:07:09

如果我有一堆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中没有的东西。

如何自动转换从FieldInfo获得的值?将GetValue设置为正确的类型

如果你使用的是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);