/// <summary>Read from <paramref name="option"/></summary>
            /// <param name="option"></param>
            /// <returns>this</returns>
            public virtual Options Read(IOption option)
            {
                IOpenOption open = option.AsOption <IOpenOption>();

                if (open != null)
                {
                    CanCreateFile = open.CanCreateFile;
                    CanOpen       = open.CanOpen;
                    CanRead       = open.CanRead;
                    CanWrite      = open.CanWrite;
                }
                IDeleteOption delete = option.AsOption <IDeleteOption>();

                if (delete != null)
                {
                    CanDelete = delete.CanDelete;
                }
                IBrowseOption browse = option.AsOption <IBrowseOption>();

                if (browse != null)
                {
                    CanBrowse   = browse.CanBrowse;
                    CanGetEntry = browse.CanGetEntry;
                }
                ISubPathOption subpath = option.AsOption <ISubPathOption>();

                if (subpath != null)
                {
                    SubPath = subpath.SubPath;
                }
                return(this);
            }
            /// <summary>
            /// Read options from <paramref name="option"/> and return flattened object.
            /// </summary>
            /// <param name="option"></param>
            /// <returns></returns>
            public static Options Read(IOption option)
            {
                Options result = new Options();

                IOpenOption open = option.AsOption <IOpenOption>();

                if (open != null)
                {
                    result.CanCreateFile = open.CanCreateFile;
                    result.CanOpen       = open.CanOpen;
                    result.CanRead       = open.CanRead;
                    result.CanWrite      = open.CanWrite;
                }
                IBrowseOption browse = option.AsOption <IBrowseOption>();

                if (browse != null)
                {
                    result.CanBrowse = browse.CanBrowse;
                }
                IObserveOption observe = option.AsOption <IObserveOption>();

                if (observe != null)
                {
                    result.CanObserve = observe.CanObserve;
                }
                IToken token = option.AsOption <IToken>();

                if (token != null)
                {
                    var enumr = option.ListTokens(false);
                    result.tokens = enumr is IToken[] arr ? arr : enumr.ToArray();
                }
                return(result);
            }