C# 动态强制原语类型从一个到另一个?

C# 动态强制原语类型从一个到另一个?,c#,type-conversion,C#,Type Conversion,我正在研究一个相当棘手的问题。在非常高的层次上,我有一个对象,它是一个原语,我需要将它强制转换为C#中的另一个原语类型。值和类型在运行时确定 我大致尝试了这一点(我的代码更复杂,这说明了问题): 这在某些情况下有效,除非(如上所述)发生溢流或下溢 我希望发生的是强制(而不是转化)会发生。在本例中,我只希望“(int)0x8ba9dc90”变成“(ulong)0x8ba9dc90”。与浮点类似:如果value=“(float)-32.01”和“t”是“UInt64”,我希望结果是“0xffffff

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

我大致尝试了这一点(我的代码更复杂,这说明了问题):

这在某些情况下有效,除非(如上所述)发生溢流或下溢

我希望发生的是强制(而不是转化)会发生。在本例中,我只希望“(int)0x8ba9dc90”变成“(ulong)0x8ba9dc90”。与浮点类似:如果value=“(float)-32.01”和“t”是“UInt64”,我希望结果是“0xffffffffff0”。这正是运行“unchecked{ulong u=(ulong)(double)-32.01;}”时得到的结果

有没有办法做到这一点,还是我一直在写自定义转换器

(是的,我意识到这是一件奇怪的事情。这都是高度动态的代码,我正在尝试在DynamicObject.TryConvert覆盖中执行强制。我也完全知道有很多情况下,这会通过向下转换等方式丢弃数据。这在我的应用程序中非常好。我只是不知道如何在没有巨型嵌套开关语句。)

编辑:要清楚,我的函数如下所示:

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表达式进行此转换。说明了如何进行转换

基本思想是构造一个与强制转换表达式等价的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();
ParameterExpression convParameter=Expression.Parameter(typeof(object),“val”);
var conv=(Func)Expression.Lambda(
表达式。转换(
表达式。转换(
表达式。转换(
convParameter
,fromType
)
,目标类型
)
,typeof(对象)
)
,convParameter
).Compile();

现在,您可以调用
conv
并向其传递一个
对象
包装原始类型的值;它将返回一个强制值。此代码也将获取自定义类型转换(对于您自己的类型,而不是基元)。如有必要,您可以通过增加
表达式的嵌套级别来添加更多的转换。Convert
对象。

您是否尝试过使用
动态
?尝试了什么?使用动态?编译时不知道“value”和“t”。我无法将类似于“(ulong)(动态)value”的内容编写为“ulong”是此函数参数的一部分,它以“类型”的形式出现参数。您可以尝试转换为字符串,然后在目标类型中查找解析方法并尝试调用该方法。不过,您可能会遇到许多格式异常。或者,您可以尝试将源对象序列化为字节数组,然后尝试反序列化为目标类型。您会得到更疯狂的结果,尤其是当这些类型的字节表示方式变化很大。“BITWISMAN”——这里的挑战似乎不是在C++中执行C++ ++代码> RealTytCase< /Cuff>(或Pascal Type),而是处理不匹配长度的类型。
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();