/// <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); }