我正在處理一個相當棘手的問題。在非常高的層次上,我有一個對象,它是一個原始對象,我需要將它強制轉換爲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;
}
您是否嘗試過使用'dynamic'? – svick
試圖用動態? 「值」和「t」在編譯時是不知道的。我不能寫「(ulong)(動態)值」之類的東西,因爲「ulong」是該函數參數的一部分,它作爲「Type」參數來使用。 – LCC
關於http://stackoverflow.com/questions/1068541/how-to-convert-a-value-type-to-byte-in-c? – BitwiseMan