如何自动将从FieldInfo.GetValue获取的值转换为正确的类型?

时间:2011-08-29 13:04:03

标签: c# reflection casting

如果我有一堆FieldInfo的实例,并且我已经知道他们的FieldType是可以传递给BinaryWriter.Write(...)的类型之一,我该如何自动传递BinaryWriter.Write(...)的给定对象的字段,而不对一组类型测试FieldType并手动转换为匹配类型?

E.g。如何避免必须执行以下操作:

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中没有的东西。

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

您需要使用反射调用Write以在运行时而不是编译时找到正确的重载:

typeof(BinaryWriter).InvokeMember(
    "Write", 
    BindingFlags.InvokeMethod, 
    null,
    binaryWriter,
    new object[] { value }
);

如果你使用的是C#4,你也可以使用dynamic

binaryWriter.Write((dynamic)value);

答案 2 :(得分:0)

动态关键字可以在这里使用

binaryWriter.Write((dynamic)value);