diff --git a/PInvoke/Shared/InteropServices/SafeNativeListBase.cs b/PInvoke/Shared/InteropServices/SafeNativeListBase.cs
new file mode 100644
index 00000000..abca1d34
--- /dev/null
+++ b/PInvoke/Shared/InteropServices/SafeNativeListBase.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using Vanara.PInvoke;
+
+namespace Vanara.InteropServices
+{
+ /// An abstract base class for a safe, unmanaged list of structures allocated by a memory scheme.
+ /// The type of the list elements.
+ /// The type of memory allocation to use.
+ public abstract class SafeNativeListBase : SafeMemoryHandle, IReadOnlyList where TElem : struct where TMem : IMemoryMethods, new()
+ {
+ /// Initializes a new instance of the class.
+ /// The handle.
+ /// The size of memory allocated to the handle, in bytes.
+ /// if set to true if this class is responsible for freeing the memory on disposal.
+ protected SafeNativeListBase(IntPtr ptr, SizeT size, bool ownsHandle) : base(ptr, size, ownsHandle) { }
+
+ /// Initializes a new instance of the class.
+ /// The number of bytes to allocate for this new array.
+ public SafeNativeListBase(SizeT byteCount) : base(byteCount) { }
+
+ /// Gets the number of elements contained in the .
+ public virtual int Count => IsInvalid ? 0 : Items.Count();
+
+ /// Enumerates the elements.
+ /// An enumeration of values from the pointer.
+ protected abstract IEnumerable Items { get; }
+
+ /// Gets or sets the value at the specified index.
+ /// The value.
+ /// The index.
+ ///
+ /// index or index
+ public virtual TElem this[int index] => Items.ElementAt(index);
+
+ /// Determines whether this instance contains the object.
+ /// The object to locate in the .
+ ///
+ /// true if is found in the ; otherwise, false.
+ ///
+ public virtual bool Contains(TElem item) => Items.Contains(item);
+
+ /// Returns an enumerator that iterates through the collection.
+ /// A that can be used to iterate through the collection.
+ public virtual IEnumerator GetEnumerator() => Items.GetEnumerator();
+
+ /// Returns an enumerator that iterates through a collection.
+ /// An object that can be used to iterate through the collection.
+ IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
+ }
+}
\ No newline at end of file