CodeAccessPermission.IsSubsetOf(IPermission) Метод

Определение

При реализации в производном классе определяет, является ли текущее разрешение подмножеством указанного разрешения.

public:
 abstract bool IsSubsetOf(System::Security::IPermission ^ target);
public abstract bool IsSubsetOf (System.Security.IPermission target);
abstract member IsSubsetOf : System.Security.IPermission -> bool
Public MustOverride Function IsSubsetOf (target As IPermission) As Boolean

Параметры

target
IPermission

Разрешение, для которого требуется проверить отношение подмножества. Его тип должен совпадать с типом текущего разрешения.

Возвращаемое значение

Boolean

Значение true, если текущее разрешение является подмножеством указанного разрешения. В противном случае — значение false.

Реализации

Исключения

Параметр target не равен null и имеет тип, не совпадающий с типом текущего разрешения.

Примеры

В следующем примере кода показано переопределение IsSubsetOf метода. Этот пример кода является частью более крупного примера, предоставленного CodeAccessPermission для класса.

public:
   virtual bool IsSubsetOf( IPermission^ target ) override
   {
#if ( debug ) 
      Console::WriteLine( "************* Entering IsSubsetOf *********************" );
#endif

      if ( target == nullptr )
      {
         Console::WriteLine( "IsSubsetOf: target == null" );
         return false;
      }

#if ( debug ) 
      Console::WriteLine( "This is = {0}", ((NameIdPermission)this).Name );
      Console::WriteLine( "Target is {0}", ((NameIdPermission)target).m_Name );
#endif

      try
      {
         NameIdPermission^ operand = dynamic_cast<NameIdPermission^>(target);
         
         // The following check for unrestricted permission is only included as an example for
         // permissions that allow the unrestricted state. It is of no value for this permission.
         if ( true == operand->m_Unrestricted )
         {
            return true;
         }
         else if ( true == this->m_Unrestricted )
         {
            return false;
         }

         if ( this->m_Name != nullptr )
         {
            if ( operand->m_Name == nullptr )
            {
               return false;
            }
            if ( this->m_Name->Equals( "" ) )
            {
               return true;
            }
         }

         if ( this->m_Name->Equals( operand->m_Name ) )
         {
            return true;
         }
         else
         {
            // Check for wild card character '*'.
            int i = operand->m_Name->LastIndexOf( "*" );

            if ( i > 0 )
            {
               String^ prefix = operand->m_Name->Substring( 0, i );
               if ( this->m_Name->StartsWith( prefix ) )
               {
                  return true;
               }
            }
         }
         return false;
      }
      catch ( InvalidCastException^ ) 
      {
         throw gcnew ArgumentException( String::Format( "Argument_WrongType", this->GetType()->FullName ) );
      }
   }
        public override bool IsSubsetOf(IPermission target)
        {
#if(debug)
            Console.WriteLine ("************* Entering IsSubsetOf *********************");
#endif
            if (target == null)
            {
                Console.WriteLine ("IsSubsetOf: target == null");
                return false;
            }
#if(debug)

            Console.WriteLine ("This is = " + (( NameIdPermission)this).Name);
            Console.WriteLine ("Target is " + (( NameIdPermission)target).m_Name);
#endif
            try
            {
                 NameIdPermission operand = ( NameIdPermission)target;

                // The following check for unrestricted permission is only included as an example for
                // permissions that allow the unrestricted state. It is of no value for this permission.
                if (true == operand.m_Unrestricted)
                {
                    return true;
                }
                else if (true == this.m_Unrestricted)
                {
                    return false;
                }

                if (this.m_Name != null)
                {
                    if (operand.m_Name == null) return false;

                    if (this.m_Name == "") return true;
                }

                if (this.m_Name.Equals (operand.m_Name))
                {
                    return true;
                }
                else
                {
                    // Check for wild card character '*'.
                    int i = operand.m_Name.LastIndexOf ("*");

                    if (i > 0)
                    {
                        string prefix = operand.m_Name.Substring (0, i);

                        if (this.m_Name.StartsWith (prefix))
                        {
                            return true;
                        }
                    }
                }

                return false;
            }
            catch (InvalidCastException)
            {
                throw new ArgumentException (String.Format ("Argument_WrongType", this.GetType ().FullName));
            }
        }
        Public Overrides Function IsSubsetOf(ByVal target As IPermission) As Boolean

#If (Debug) Then

            Console.WriteLine("************* Entering IsSubsetOf *********************")
#End If
            If target Is Nothing Then
                Console.WriteLine("IsSubsetOf: target == null")
                Return False
            End If
#If (Debug) Then
            Console.WriteLine(("This is = " + CType(Me, NameIdPermission).Name))
            Console.WriteLine(("Target is " + CType(target, NameIdPermission).m_name))
#End If
            Try
                Dim operand As NameIdPermission = CType(target, NameIdPermission)

                ' The following check for unrestricted permission is only included as an example for
                ' permissions that allow the unrestricted state. It is of no value for this permission.
                If True = operand.m_Unrestricted Then
                    Return True
                ElseIf True = Me.m_Unrestricted Then
                    Return False
                End If

                If Not (Me.m_name Is Nothing) Then
                    If operand.m_name Is Nothing Then
                        Return False
                    End If
                    If Me.m_name = "" Then
                        Return True
                    End If
                End If
                If Me.m_name.Equals(operand.m_name) Then
                    Return True
                Else
                    ' Check for wild card character '*'.
                    Dim i As Integer = operand.m_name.LastIndexOf("*")

                    If i > 0 Then
                        Dim prefix As String = operand.m_name.Substring(0, i)

                        If Me.m_name.StartsWith(prefix) Then
                            Return True
                        End If
                    End If
                End If

                Return False
            Catch
                Throw New ArgumentException(String.Format("Argument_WrongType", Me.GetType().FullName))
            End Try
        End Function

Комментарии

Текущее разрешение является подмножеством указанного разрешения, если текущее разрешение указывает набор операций, которые изначально содержатся в указанном разрешении. Например, разрешение, представляющее доступ к C:\example.txt, является подмножеством разрешения, представляющего доступ к C:\. Если этот метод возвращается true, текущее разрешение не представляет больше доступа к защищенному ресурсу, чем указанное разрешение.

Для всех переопределения IsSubsetOf метода требуются true следующие инструкции. X, Y и Z представляют объекты разрешений доступа к пользовательскому коду, которые не являются пустыми ссылками, U представляет неограниченное разрешение на доступ к коду, а N — пустое разрешение.PermissionState None

  • X. Возвращает IsSubsetOf(X).true

  • X. IsSubsetOf(Y) возвращает то же значение, что и Y. IsSubsetOf(X), если и только если X и Y представляют один и тот же набор разрешений.

  • Если X. IsSubsetOf(Y) и Y. IsSubsetOf(Z) оба возвращают true, X. Возвращает IsSubsetOf(Z).true

  • X. IsSubsetOf(U) возвращает .true

  • X. Возвращает IsSubsetOf(N).false

  • N. Возвращает IsSubsetOf(X).true

Если X и Y представляют объекты разрешений доступа к пользовательскому коду, которые являются пустыми ссылками, X. IsSubsetOf(Y) возвращает .true Если Z также имеет значение NULL, операция составного набора X. Union(Y). IsSubsetOf(Z) также возвращается true , так как объединение двух разрешений NULL является пустым разрешением.

Примечания для тех, кто реализует этот метод

Этот метод необходимо переопределить в производном классе.

Применяется к