/// <summary>
        /// Releases the memory allocated during a call to <see cref="GetNativeAttribute"/>
        /// </summary>
        internal void FreeNativeAttribute()
        {
            if (this.radiusAttribute == null)
            {
                return;
            }

            var ip = this.value as IPAddress;
            if (ip != null && ip.AddressFamily == AddressFamily.InterNetworkV6)
            {
                Marshal.FreeHGlobal(this.radiusAttribute.Value.lpValue);
                this.radiusAttribute = null;
                return;
            }

            if (this.value is string ||
                this.value is byte[] ||
                this.value is VendorSpecificAttribute)
            {
                Marshal.FreeHGlobal(this.radiusAttribute.Value.lpValue);
                this.radiusAttribute = null;
            }
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="RadiusAttribute"/> class.
 /// </summary>
 /// <param name="radiusAttributePtr">Pointer to the native attribute.</param>
 internal RadiusAttribute(IntPtr radiusAttributePtr)
 {
     this.radiusAttributePtr = radiusAttributePtr;
     this.radiusAttribute = (RADIUS_ATTRIBUTE)Marshal.PtrToStructure(this.radiusAttributePtr, typeof(RADIUS_ATTRIBUTE));
 }
        /// <summary>
        /// Gets the native representation of this attribute. The caller is responsible to free the memory allocated in this method with a call to <see cref="FreeNativeAttribute"/>.
        /// </summary>
        /// <returns>The native representation of this attribute.</returns>
        internal RADIUS_ATTRIBUTE GetNativeAttribute()
        {
            if (this.radiusAttribute == null)
            {
                this.radiusAttribute = new RADIUS_ATTRIBUTE { dwAttrType = this.attributeId };
                this.SetAttributeValue();
            }

            return this.radiusAttribute;
        }