我正在研究一个相当棘手的问题。在非常高的层次上,我有一个原始对象,我需要将它强制转换为 C# 中的不同原始类型。值和类型在运行时确定。
我大致尝试了这个(我的代码更复杂,这说明了问题):
object value = (int)0x8ba9dc90;
Type t = typeof(UInt64);
object result = Convert.ChangeType(value, t);
这在某些时候有效,除非在(如上所述)会发生上溢或下溢的情况下。
我想要发生的是强制(而不是转换)会发生。在这种情况下,我只是希望“(int)0x8ba9dc90”为“(ulong)0x8ba9dc90”。与浮点数类似:如果 value = "(float)-32.01" 且 "t" 为 "UInt64",我希望结果为 "0xffffffffffffffe0"。这正是你运行“unchecked { ulong u = (ulong)(double)-32.01; }”时得到的结果
有什么办法可以做到这一点,还是我坚持编写自定义转换器?
(是的,我意识到这是一件奇怪的事情。这都是高度动态的代码,我正在尝试在 DynamicObject.TryConvert 覆盖中进行强制。我也完全知道在很多情况下这会通过向下转换等丢弃数据。这在我的应用程序中非常好。如果没有巨大的嵌套 switch 语句,我无法弄清楚如何编写它。)
编辑:要清楚我的功能看起来像这样:
public override bool TryConvert(ConvertBinder binder, out object result)
{
if (binder.Type.IsPrimitive && m_type.IsPrimitive)
{
// m_type is System.Type, which is m_value's current type.
// m_value is System.Object, contains a primitive value.
// binder.Type is the System.Type I need to coerce m_value into.
result = Convert.ChangeType(m_value, binder.Type);
return true;
}
result = null;
return false;
}