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