private void Build()
        {
            // Basic data
            _data = new UIAutomationPatternInfo
            {
                pProgrammaticName = _programmaticName,
                guid = _patternGuid,
                clientInterfaceId   = _clientInterfaceId,
                providerInterfaceId = _providerInterfaceId,
                pPatternHandler     = _patternHandler,
                cMethods            = (uint)_methods.Count
            };

            // Build the list of methods
            if (_data.cMethods > 0)
            {
                _data.pMethods = Marshal.AllocCoTaskMem((int)(_data.cMethods * Marshal.SizeOf(typeof(UIAutomationMethodInfo))));
                var methodPointer = _data.pMethods;
                for (var i = 0; i < _data.cMethods; ++i)
                {
                    Marshal.StructureToPtr(_methods[i].Data, methodPointer, false);
                    methodPointer = (IntPtr)(methodPointer.ToInt64() + Marshal.SizeOf(typeof(UIAutomationMethodInfo)));
                }
            }
            else
            {
                _data.pMethods = IntPtr.Zero;
            }

            // Build the list of properties
            _data.cProperties = (uint)_properties.Count;
            if (_data.cProperties > 0)
            {
                _data.pProperties = Marshal.AllocCoTaskMem((int)(_data.cProperties * Marshal.SizeOf(typeof(UIAutomationPropertyInfo))));
                var propertyPointer = _data.pProperties;
                for (var i = 0; i < _data.cProperties; ++i)
                {
                    Marshal.StructureToPtr(_properties[i].Data, propertyPointer, false);
                    propertyPointer = (IntPtr)(propertyPointer.ToInt64() + Marshal.SizeOf(typeof(UIAutomationPropertyInfo)));
                }
            }
            else
            {
                _data.pProperties = IntPtr.Zero;
            }

            // Build the list of events
            _data.cEvents = (uint)_events.Count;
            if (_data.cEvents > 0)
            {
                _data.pEvents = Marshal.AllocCoTaskMem((int)(_data.cEvents * Marshal.SizeOf(typeof(UIAutomationEventInfo))));
                var eventPointer = _data.pEvents;
                for (var i = 0; i < _data.cEvents; ++i)
                {
                    Marshal.StructureToPtr(_events[i].Data, eventPointer, false);
                    eventPointer = (IntPtr)(eventPointer.ToInt64() + Marshal.SizeOf(typeof(UIAutomationEventInfo)));
                }
            }
            else
            {
                _data.pEvents = IntPtr.Zero;
            }

            _built = true;
        }
        private void Build()
        {
            // Basic data
            _data = new UIAutomationPatternInfo
                    {
                        pProgrammaticName = _programmaticName,
                        guid = _patternGuid,
                        clientInterfaceId = _clientInterfaceId,
                        providerInterfaceId = _providerInterfaceId,
                        pPatternHandler = _patternHandler,
                        cMethods = (uint) _methods.Count
                    };

            // Build the list of methods
            if (_data.cMethods > 0)
            {
                _data.pMethods = Marshal.AllocCoTaskMem((int) (_data.cMethods*Marshal.SizeOf(typeof (UIAutomationMethodInfo))));
                var methodPointer = _data.pMethods;
                for (var i = 0; i < _data.cMethods; ++i)
                {
                    Marshal.StructureToPtr(_methods[i].Data, methodPointer, false);
                    methodPointer = (IntPtr) (methodPointer.ToInt64() + Marshal.SizeOf(typeof (UIAutomationMethodInfo)));
                }
            }
            else
            {
                _data.pMethods = IntPtr.Zero;
            }

            // Build the list of properties
            _data.cProperties = (uint) _properties.Count;
            if (_data.cProperties > 0)
            {
                _data.pProperties = Marshal.AllocCoTaskMem((int) (_data.cProperties*Marshal.SizeOf(typeof (UIAutomationPropertyInfo))));
                var propertyPointer = _data.pProperties;
                for (var i = 0; i < _data.cProperties; ++i)
                {
                    Marshal.StructureToPtr(_properties[i].Data, propertyPointer, false);
                    propertyPointer = (IntPtr) (propertyPointer.ToInt64() + Marshal.SizeOf(typeof (UIAutomationPropertyInfo)));
                }
            }
            else
            {
                _data.pProperties = IntPtr.Zero;
            }

            // Build the list of events
            _data.cEvents = (uint) _events.Count;
            if (_data.cEvents > 0)
            {
                _data.pEvents = Marshal.AllocCoTaskMem((int) (_data.cEvents*Marshal.SizeOf(typeof (UIAutomationEventInfo))));
                var eventPointer = _data.pEvents;
                for (var i = 0; i < _data.cEvents; ++i)
                {
                    Marshal.StructureToPtr(_events[i].Data, eventPointer, false);
                    eventPointer = (IntPtr) (eventPointer.ToInt64() + Marshal.SizeOf(typeof (UIAutomationEventInfo)));
                }
            }
            else
            {
                _data.pEvents = IntPtr.Zero;
            }

            _built = true;
        }