/// <summary>
        /// Get an object in memory from specified base address. This will try to use runtime dynamic cast to ensure object is valid type.
        /// It will return null if object could not be cast, type is not registered or memory could not be read properly. The base address
        /// of returned object may or may not equal specified address.
        /// </summary>
        /// <typeparam name="T">Type of object to get.</typeparam>
        /// <param name="address">The base address of object. If an object is returned the base address of object may be different!</param>
        /// <returns></returns>
        public static T FromAddressSafeCast <T>(IntPtr address) where T : IVirtualObject
        {
            if (address == IntPtr.Zero)
            {
                return(default(T));
            }

            TypeDescriptor t = null;

            if (Main.Game != null)
            {
                if (!Main.Game.Types.TypesByInterface.TryGetValue(typeof(T), out t))
                {
                    t = null;

                    var t3 = typeof(T);
                    if (t3.IsGenericType && !t3.IsGenericTypeDefinition)
                    {
                        var t2 = t3.GetGenericTypeDefinition();
                        if (!Main.Game.Types.TypesByInterface.TryGetValue(t2, out t))
                        {
                            t = null;
                        }
                    }
                }
            }

            if (t == null)
            {
                return(default(T));
            }

            T mo;

            try
            {
                mo = MemoryObject.FromAddress <T>(address);
            }
            catch (ArgumentException)
            {
                return(default(T));
            }

            try
            {
                var result = mo.As <T>();
                return(result);
            }
            catch (NotSupportedException)
            {
            }

            return(default(T));
        }
 /// <summary>
 /// Get an object in memory from specified pointer.
 /// </summary>
 /// <param name="t">The type of object to get.</param>
 /// <param name="address">The pointer address.</param>
 /// <returns></returns>
 /// <exception cref="System.ArgumentNullException">t</exception>
 /// <exception cref="System.ArgumentException">
 /// Type can not be abstract!
 /// or
 /// Type must inherit from MemoryObject!
 /// </exception>
 public static IMemoryObject FromPointer(Type t, IntPtr address)
 {
     return(MemoryObject.FromAddress(t, Memory.ReadPointer(address)));
 }
 /// <summary>
 /// Get an object in memory from specified pointer.
 /// </summary>
 /// <typeparam name="T">Type of object to get.</typeparam>
 /// <param name="address">The pointer address of object.</param>
 /// <returns></returns>
 public static T FromPointer <T>(IntPtr address) where T : IMemoryObject
 {
     return(MemoryObject.FromAddress <T>(Memory.ReadPointer(address)));
 }