gpt4 book ai didi

c# - 将原始类型从一种动态强制转换为另一种?

转载 作者:太空狗 更新时间:2023-10-30 01:23:03 24 4
gpt4 key购买 nike

我正在处理一个相当棘手的问题。在非常高的层次上,我有一个原始对象,我需要在 C# 中将它强制转换为不同的原始类型。值和类型在运行时确定。

我粗略地尝试了这个(我的代码更复杂,这说明了问题):

object value = (int)0x8ba9dc90;
Type t = typeof(UInt64);
object result = Convert.ChangeType(value, t);

这有时会起作用,除非(如上所述)会发生上溢或下溢。

希望发生的是强制(而不是转换)发生。在这种情况下,我只是希望“(int)0x8ba9dc90”成为“(ulong)0x8ba9dc90”。与 float 类似:如果 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;
}

最佳答案

您可以使用 LINQ 表达式来进行这种转换。 This article解释如何。

基本思想是构造一个等同于强制转换表达式的 LINQ 表达式。

ParameterExpression convParameter = Expression.Parameter(typeof(object), "val");
var conv = (Func<object,object>)Expression.Lambda(
Expression.Convert(
Expression.Convert(
Expression.Convert(
convParameter
, fromType
)
, targetType
)
, typeof(object)
)
, convParameter
).Compile();

现在你可以调用conv并传递给它一个object包装原始类型的值;它会返回一个强制值给你。此代码也将选择您的自定义类型转换(对于您自己的类型,而不是原始类型)。如有必要,您可以通过增加 Expression.Convert 对象的嵌套级别在两者之间添加更多转换。

关于c# - 将原始类型从一种动态强制转换为另一种?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12335869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com