public static DERProtocolOperation Extract(ICollection <byte> buffer)
        {
            var result = new DERProtocolOperation();

            result.ExtractTagAndLength(buffer);
            switch (result.Tag.LdapCommand)
            {
            case LdapCommands.SearchRequest:
                result.Operation = SearchRequest.Extract(buffer);
                break;

            case LdapCommands.BindRequest:
                result.Operation = BindRequest.Extract(buffer);
                break;

            case LdapCommands.UnbindRequest:
                result.Operation = UnbindRequest.Extract(buffer);
                break;

            case LdapCommands.AddRequest:
                result.Operation = AddRequest.Extract(buffer);
                break;

            case LdapCommands.DelRequest:
                result.Operation = DelRequest.Extract(buffer, result.Length);
                break;

            case LdapCommands.ModifyDNRequest:
                result.Operation = ModifyDNRequest.Extract(buffer);
                break;

            case LdapCommands.CompareRequest:
                result.Operation = CompareRequest.Extract(buffer);
                break;

            case LdapCommands.AbandonRequest:
                result.Operation = AbandonRequest.Extract(buffer);
                break;

            case LdapCommands.ModifyRequest:
                result.Operation = ModifyRequest.Extract(buffer);
                break;

            case LdapCommands.SearchResultDone:
                result.Operation = SearchResultDone.Extract(buffer);
                break;

            case LdapCommands.BindResponse:
                result.Operation = BindResponse.Extract(buffer);
                break;

            case LdapCommands.AddResponse:
                result.Operation = AddResponse.Extract(buffer);
                break;

            case LdapCommands.SearchResultEntry:
                result.Operation = SearchResultEntry.Extract(buffer);
                break;
            }

            return(result);
        }