public void SetValue(object obj) { vt = (short)VarEnum.VT_EMPTY; if (obj == null) { return; } Type t = obj.GetType(); if (t.IsEnum) { t = Enum.GetUnderlyingType(t); } if (t == typeof(sbyte)) { vt = (short)VarEnum.VT_I1; cVal = (sbyte)obj; } else if (t == typeof(byte)) { vt = (short)VarEnum.VT_UI1; bVal = (byte)obj; } else if (t == typeof(short)) { vt = (short)VarEnum.VT_I2; iVal = (short)obj; } else if (t == typeof(ushort) || t == typeof(char)) { vt = (short)VarEnum.VT_UI2; uiVal = (ushort)obj; } else if (t == typeof(int)) { vt = (short)VarEnum.VT_I4; lVal = (int)obj; } else if (t == typeof(uint)) { vt = (short)VarEnum.VT_UI4; ulVal = (uint)obj; } else if (t == typeof(long)) { vt = (short)VarEnum.VT_I8; llVal = (long)obj; } else if (t == typeof(ulong)) { vt = (short)VarEnum.VT_UI8; ullVal = (ulong)obj; } else if (t == typeof(float)) { vt = (short)VarEnum.VT_R4; fltVal = (float)obj; } else if (t == typeof(double)) { vt = (short)VarEnum.VT_R8; dblVal = (double)obj; } else if (t == typeof(string)) { vt = (short)VarEnum.VT_BSTR; bstrVal = Marshal.StringToBSTR((string)obj); } else if (t == typeof(bool)) { vt = (short)VarEnum.VT_BOOL; lVal = ((bool)obj) ? -1 : 0; } else if (t == typeof(BStrWrapper)) { vt = (short)VarEnum.VT_BSTR; bstrVal = Marshal.StringToBSTR(((BStrWrapper)obj).WrappedObject); } else if (t == typeof(CurrencyWrapper)) { vt = (short)VarEnum.VT_CY; llVal = Decimal.ToOACurrency(((CurrencyWrapper)obj).WrappedObject); } else if (t == typeof(DateTime)) { vt = (short)VarEnum.VT_DATE; dblVal = ((DateTime)obj).ToOADate(); } else if (t == typeof(Decimal)) { vt = (short)VarEnum.VT_DECIMAL; int[] parts = Decimal.GetBits((Decimal)obj); decVal.scale = (byte)((parts[3] >> 16) & 0x7F); decVal.sign = (byte)(parts[3] >> 24); decVal.Hi32 = parts[2]; decVal.Lo64 = (uint)parts[0] | ((ulong)(uint)parts[1] << 32); } else if (t == typeof(ErrorWrapper)) { vt = (short)VarEnum.VT_ERROR; lVal = ((ErrorWrapper)obj).ErrorCode; } #if FEATURE_COMINTEROP else if (t == typeof(UnknownWrapper)) { vt = (short)VarEnum.VT_UNKNOWN; pdispVal = Marshal.GetIUnknownForObject(((UnknownWrapper)obj).WrappedObject); } else if (t == typeof(DispatchWrapper)) { vt = (short)VarEnum.VT_DISPATCH; pdispVal = Marshal.GetIDispatchForObject(((DispatchWrapper)obj).WrappedObject); } #endif else if (t.UnderlyingSystemType.IsArray) { int tmp; pdispVal = SafeArrayFromArrayInternal((Array)obj, out tmp); vt = (short)(tmp | (int)VarEnum.VT_ARRAY); } else { #if !FEATURE_COMINTEROP throw new NotImplementedException(string.Format("Variant couldn't handle object of type {0}", obj.GetType())); #else try { pdispVal = Marshal.GetIDispatchForObject(obj); vt = (short)VarEnum.VT_DISPATCH; return; } catch { } try { vt = (short)VarEnum.VT_UNKNOWN; pdispVal = Marshal.GetIUnknownForObject(obj); } catch (Exception ex) { throw new NotImplementedException(string.Format("Variant couldn't handle object of type {0}", obj.GetType()), ex); } #endif } }
// Constructs a Currency from a Decimal value. // public Currency(Decimal value) { m_value = Decimal.ToOACurrency(value); }
public static void SetValueAt(object obj, int vt, IntPtr addr) { Type t = obj.GetType(); switch ((VarEnum)vt) { case VarEnum.VT_I1: *((sbyte *)addr) = (sbyte)obj; break; case VarEnum.VT_UI1: *((byte *)addr) = (byte)obj; break; case VarEnum.VT_I2: *((short *)addr) = (short)obj; break; case VarEnum.VT_UI2: *((ushort *)addr) = (ushort)obj; break; case VarEnum.VT_INT: case VarEnum.VT_I4: *((int *)addr) = (int)obj; break; case VarEnum.VT_UINT: case VarEnum.VT_UI4: *((uint *)addr) = (uint)obj; break; case VarEnum.VT_I8: *((long *)addr) = (long)obj; break; case VarEnum.VT_UI8: *((ulong *)addr) = (ulong)obj; break; case VarEnum.VT_R4: *((float *)addr) = (float)obj; break; case VarEnum.VT_R8: *((double *)addr) = (double)obj; break; case VarEnum.VT_BOOL: *((short *)addr) = (short)((bool)obj ? -1 : 0); break; case VarEnum.VT_BSTR: if (t == typeof(BStrWrapper)) { *((IntPtr *)addr) = Marshal.StringToBSTR(((BStrWrapper)obj).WrappedObject); } else { *((IntPtr *)addr) = Marshal.StringToBSTR((string)obj); } break; case VarEnum.VT_CY: if (t == typeof(CurrencyWrapper)) { *((long *)addr) = Decimal.ToOACurrency(((CurrencyWrapper)obj).WrappedObject); } else { *((long *)addr) = Decimal.ToOACurrency((Decimal)obj); } break; case VarEnum.VT_DATE: *((double *)addr) = ((DateTime)obj).ToOADate(); break; case VarEnum.VT_DECIMAL: { int[] parts = Decimal.GetBits((Decimal)obj); DECIMAL *dec = (DECIMAL *)addr; dec->scale = (byte)((parts[3] >> 16) & 0x7F); dec->sign = (byte)(parts[3] >> 24); dec->Hi32 = parts[2]; dec->Lo64 = (uint)parts[0] | ((ulong)(uint)parts[1] << 32); break; } case VarEnum.VT_ERROR: if (t == typeof(ErrorWrapper)) { *((int *)addr) = ((ErrorWrapper)obj).ErrorCode; } else { *((int *)addr) = (int)obj; } break; case VarEnum.VT_VARIANT: { Variant v = default(Variant); v.SetValue(obj); *((Variant *)addr) = v; break; } #if FEATURE_COMINTEROP case VarEnum.VT_UNKNOWN: if (t == typeof(UnknownWrapper)) { *((IntPtr *)addr) = Marshal.GetIUnknownForObject(((UnknownWrapper)obj).WrappedObject); } else { *((IntPtr *)addr) = Marshal.GetIUnknownForObject(obj); } break; case VarEnum.VT_DISPATCH: if (t == typeof(DispatchWrapper)) { *((IntPtr *)addr) = Marshal.GetIDispatchForObject(((DispatchWrapper)obj).WrappedObject); } else { *((IntPtr *)addr) = Marshal.GetIDispatchForObject(obj); } break; #endif default: if (((VarEnum)vt & VarEnum.VT_ARRAY) != 0) { int tmp; *((IntPtr *)addr) = SafeArrayFromArrayInternal((Array)obj, out tmp); break; } throw new NotImplementedException(string.Format("Variant.SetValueAt couldn't handle VT {0}", vt)); } }
public static Int64 ToOACurrency(this Decimal value) { return Decimal.ToOACurrency(value); }