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

C# 如何将从FieldInfo.GetValue获得的值自动转换为正确的类型?,c#,reflection,casting,C#,Reflection,Casting,如果我有一堆FieldInfo的实例,并且我已经知道它们的FieldType是可以传递给BinaryWriter.Write(…)的类型之一,那么如何自动将给定对象的字段传递给BinaryWriter.Write(…)不针对一组类型测试字段类型,并手动转换为匹配类型 例如,我如何避免必须执行以下操作: object value = fieldInfo.GetValue(foo); if (fieldInfo.FieldType == typeof(int)) { binaryWriter

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

例如,我如何避免必须执行以下操作:

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

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

typeof(BinaryWriter).InvokeMember(
    "Write", 
    BindingFlags.InvokeMethod, 
    null,
    binaryWriter,
    new object[] { value }
);
如果您使用的是C#4,那么您也可以使用
动态

binaryWriter.Write((dynamic)value);

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

typeof(BinaryWriter).InvokeMember(
    "Write", 
    BindingFlags.InvokeMethod, 
    null,
    binaryWriter,
    new object[] { value }
);
如果您使用的是C#4,那么您也可以使用
动态

binaryWriter.Write((dynamic)value);
如果您使用的是C#4,最简单的方法是使用动态类型,并让它进行排序:

dynamic value = fieldInfo.GetValue(foo);
binaryWriter.Write(value);
这是假设您总是只想调用
binaryWriter.Write的重载。另一种选择是使用从值类型到“如何处理”的字典:

如果您使用的是C#4,最简单的方法是使用动态类型,并让它进行排序:

dynamic value = fieldInfo.GetValue(foo);
binaryWriter.Write(value);
这是假设您总是只想调用
binaryWriter.Write的重载。另一种选择是使用从值类型到“如何处理”的字典:


动态关键字在这里可以工作

binaryWriter.Write((dynamic)value);

动态关键字在这里可以工作

binaryWriter.Write((dynamic)value);

你能提供更多细节吗?也许是一个例子或链接?谢谢,第一个。我正在使用C#3.0瞄准.NET2.0来对付我的罪恶。请注意,这将相当缓慢。Jon Skeet的代表字典应该快得多。你能提供更多细节吗?也许是一个例子或链接?谢谢,第一个。我正在使用C#3.0瞄准.NET2.0来对付我的罪恶。请注意,这将相当缓慢。Jon Skeet的代表字典应该快得多。遗憾的是,我没有使用C#4。我正在使用C#3.0瞄准.NET2.0。不过,字典的想法很有趣,谢谢。或者,更好的是,使用表达式树的
GetMethods().ToDictionary
。遗憾的是,我没有使用C#4。我正在使用C#3.0瞄准.NET2.0。不过字典的想法很有趣,谢谢。或者更好的是,
GetMethods().ToDictionary
带有表达式树。重复和错误的框架,应该按return而不是泡茶:)重复和错误的框架,应该按return而不是泡茶:)