示例#1
0
            public object?ToObject()
            {
                fixed(VARIANT *thisVariant = &this)
                {
                    void *data = &thisVariant->data;

                    if (Byref)
                    {
                        data = *((void **)data);
                        // CLR allows VT_EMPTY/NULL | VT_BYREF to have no data.
                        // In other cases, the variant is invalid.
                        if (data is null && !(Type == VARENUM.EMPTY || Type == VARENUM.NULL))
                        {
                            throw new ArgumentException("Invalid Variant");
                        }
                    }
                    else if (vt == VARENUM.DECIMAL)
                    {
                        data = thisVariant;
                    }

                    // Note that the following check also covers VT_ILLEGAL.
                    if ((vt & ~(VARENUM.BYREF | VARENUM.ARRAY | VARENUM.VECTOR)) >= (VARENUM)0x80)
                    {
                        throw new InvalidOleVariantTypeException();
                    }

                    if ((vt & VARENUM.VECTOR) != 0)
                    {
                        return(ToVector(thisVariant->data.ca, vt));
                    }

                    if ((vt & VARENUM.ARRAY) != 0)
                    {
                        return(ToArray(*(SAFEARRAY **)data, vt));
                    }

                    return(ToObject(Type, Byref, data));
                }
            }
示例#2
0
 public void Clear()
 {
     PropVariantClear(ref this);
     vt   = VARENUM.EMPTY;
     data = new VARIANTUnion();
 }