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而不是泡茶:)