2012-09-09 68 views
4

我正在處理一個相當棘手的問題。在非常高的層次上,我有一個對象,它是一個原始對象,我需要將它強制轉換爲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覆蓋中進行強制轉換,我也完全意識到有很多的情況下,這將通過羽絨扔掉數據等,這在我的應用程序中是完全正常的,我只是不知道如何編寫這個沒有巨大的嵌套開關語句)。我的功能看起來像這樣:

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; 
} 
+0

您是否嘗試過使用'dynamic'? – svick

+0

試圖用動態? 「值」和「t」在編譯時是不知道的。我不能寫「(ulong)(動態)值」之類的東西,因爲「ulong」是該函數參數的一部分,它作爲「Type」參數來使用。 – LCC

+1

關於http://stackoverflow.com/questions/1068541/how-to-convert-a-value-type-to-byte-in-c? – BitwiseMan

回答

4

您可以使用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包裝原始類型的值;它會將強制值返回給您。這段代碼也會提取你的自定義類型轉換(對於你自己的類型,而不是原語)。如有必要,您可以通過增加對象的嵌套級別來增加更多轉換次數。

相關問題