Exemple #1
0
        /// <summary>
        /// Extracts a property value from a data value.
        /// </summary>
        private object DataValueToPropertyValue(DataValue value, Type expectedType, out int error)
        {
            error = ResultIds.E_INVALID_PID;

            // check for null.
            if (value == null)
            {
                return null;
            }

            // check status code.
            error = MapPropertyReadStatusToErrorCode(value.StatusCode);

            if (error < 0)
            {
                return null;
            }

            if (expectedType != null)
            {
                // check for scalar extension object.
                ExtensionObject extension = value.Value as ExtensionObject;

                if (extension != null)
                {
                    if (expectedType.IsInstanceOfType(extension.Body))
                    {
                        return extension.Body;
                    }
                    
                    error = ResultIds.E_BADTYPE;
                    return null;
                }

                // check for array of extension objects.
                ExtensionObject[] extensions = value.Value as ExtensionObject[];
                
                if (extensions != null)
                {
                    Type elementType = value.GetType().GetElementType();

                    // handle explicit type conversion.
                    Array result = Array.CreateInstance(elementType, extensions.Length);

                    for (int ii = 0; ii < extensions.Length; ii++)
                    {
                        result.SetValue(extensions[ii].Body, ii);
                    }

                    return result;
                }
                
                // check if a specific type was requested.
                if (!expectedType.IsInstanceOfType(value.Value))
                {
                    error = ResultIds.E_BADTYPE;
                    return null;
                }

                return value.Value;
            }

            // convert value.
            return ValueToVariantValue(value.Value, out error);
        }