MethodBase.IsHideBySig Eigenschap

Definitie

Hiermee wordt een waarde opgehaald die aangeeft of alleen een lid van hetzelfde type met exact dezelfde handtekening is verborgen in de afgeleide klasse.

public:
 property bool IsHideBySig { bool get(); };
public bool IsHideBySig { get; }
member this.IsHideBySig : bool
Public ReadOnly Property IsHideBySig As Boolean

Waarde van eigenschap

true als het lid door handtekening is verborgen; anders, false.

Implementeringen

Voorbeelden

Het volgende codevoorbeeld bevat een basisklasse met een overbelaste methode en een afgeleide klasse die een van de overbelastingen verbergt. In de Visual Basic versie van het codevoorbeeld retourneert de eigenschap IsHideBySigfalse voor het lid in de afgeleide klasse. In de C#-versie van het codevoorbeeld retourneert true de eigenschap voor het lid in de afgeleide klasse.

using System;
using System.Reflection;

// The base class B contains an overloaded method M.
//
public class B
{
    public virtual void M()
    {
        Console.WriteLine("B's M()");
    }
    public virtual void M(int x)
    {
        Console.WriteLine("B's M({0})", x);
    }
}

// The derived class D hides one overload of the inherited 
// method M.
//
public class D:
    B
{
    new public void M(int i)
    {
        Console.WriteLine("D's M({0})", i);
    }
}

public class Test
{
    public static void Main()
    {
        D dinst = new D();
        // In C#, the method in the derived class hides by name and by
        // signature, so the overload in the derived class hides only one
        // of the overloads in the base class.
        //
        Console.WriteLine("------ List the overloads of M in the derived class D ------");
        Type t = dinst.GetType();
        foreach( MethodInfo minfo in t.GetMethods() )
        {
            if (minfo.Name=="M") {Console.WriteLine("Overload of M: {0}  IsHideBySig = {1}, DeclaringType = {2}", minfo, minfo.IsHideBySig, minfo.DeclaringType);}
        }

        // The method M in the derived class hides one overload of the 
        // method in B.  Contrast this with Visual Basic, which hides by
        // name instead of by name and signature.  In Visual Basic, the
        // parameterless overload of M would be unavailable from D.
        //
        Console.WriteLine("------ Call the overloads of M available in D ------");
        dinst.M();
        dinst.M(42);
        
        // If D is cast to the base type B, both overloads of the 
        // shadowed method can be called.
        //
        Console.WriteLine("------ Call the shadowed overloads of M ------");
        B binst = dinst;
        binst.M();
        binst.M(42);
    } //Main
} //Test

/* This code example produces the following output:

------ List the overloads of M in the derived class D ------
Overload of M: Void M(Int32)  IsHideBySig = True, DeclaringType = B
Overload of M: Void M()  IsHideBySig = True, DeclaringType = B
Overload of M: Void M(Int32)  IsHideBySig = True, DeclaringType = D
------ Call the overloads of M available in D ------
B's M()
D's M(42)
------ Call the shadowed overloads of M ------
B's M()
B's M(42)
*/
Imports System.Reflection

' The base class B contains an overloaded method M.
'
Public Class B
    Public Overridable Sub M()
        Console.WriteLine("B's M()")
    End Sub
    Public Overridable Sub M(ByVal x As Integer)
        Console.WriteLine("B's M({0})", x)
    End Sub
End Class

' The derived class D hides the inherited method M.
'
Public Class D
    Inherits B
    Shadows Public Sub M(ByVal i As Integer)
        Console.WriteLine("D's M({0})", i)
    End Sub
End Class

Public Class Test
    Public Shared Sub Main()
        Dim dinst As New D()
        ' In Visual Basic, the method in the derived class hides by
        ' name, rather than by signature.  Thus, although a list of all the 
        ' overloads of M shows three overloads, only one can be called from
        ' class D.  
        '
        Console.WriteLine("------ List the overloads of M in the derived class D ------")
        Dim t As Type = dinst.GetType()
        For Each minfo As MethodInfo In t.GetMethods()
            If minfo.Name = "M" Then Console.WriteLine( _
                "Overload of M: {0}  IsHideBySig = {1}, DeclaringType = {2}", _
                minfo, minfo.IsHideBySig, minfo.DeclaringType)
        Next

        ' The method M in the derived class hides the method in B.
        '
        Console.WriteLine("------ Call the overloads of M available in D ------")
        ' The following line causes a compile error, because both overloads
        ' in the base class are hidden.  Contrast this with C#, where only 
        ' one of the overloads of B would be hidden.
        'dinst.M()
        dinst.M(42)
        
        ' If D is cast to the base type B, both overloads of the 
        ' shadowed method can be called.
        '
        Console.WriteLine("------ Call the shadowed overloads of M ------")
        Dim binst As B = dinst
        binst.M()
        binst.M(42)         
    End Sub
End Class

' This code example produces the following output:
' ------ List the overloads of M in the derived class D ------
' Overload of M: Void M(Int32)  IsHideBySig = False, DeclaringType = B
' Overload of M: Void M()  IsHideBySig = False, DeclaringType = B
' Overload of M: Void M(Int32)  IsHideBySig = False, DeclaringType = D
' ------ Call the overloads of M available in D ------
' D's M(42)
' ------ Call the shadowed overloads of M ------
' B's M()
' B's M(42)

Opmerkingen

Wanneer een lid in een afgeleide klasse wordt gedeclareerd met de C# new modifier of de Visual Basic Shadows modifier, kan het lid van dezelfde naam in de basisklasse verbergen. C# verbergt basisklasseleden op handtekening. Als het basisklasselid meerdere overbelastingen heeft, is het enige dat verborgen is degene met de identieke handtekening. Visual Basic verbergt daarentegen alle overbelaste basisklassen. Daarom retourneert IsHideBySigfalse op een lid dat is gedeclareerd met de Visual Basic Shadows modifier, en true op een lid dat is gedeclareerd met de C# new modifier.

Waarschuwing

Met deze eigenschap wordt niet bepaald of een methode het NewSlot kenmerk heeft. Een methode die wordt gedeclareerd met de new of de Shadows modifier heeft het NewSlot kenmerk, maar alleen methoden die zijn gedeclareerd met new (dat wil gezegd, alleen C#-methoden) hebben de IsHideBySig eigenschap ingesteld op true. Als u wilt bepalen of een methode het kenmerk NewSlot heeft, gebruikt u code die vergelijkbaar is met het volgende: if ((myMethodInfo.Attributes & MethodAttributes.VtableLayoutMask) == MethodAttributes.NewSlot) in C# of If (myMethodInfo.Attributes And MethodAttributes.VtableLayoutMask) = MethodAttributes.NewSlot in Visual Basic. Houd er echter rekening mee dat hoewel alle methoden die zijn gedeclareerd met new of Shadows het kenmerk hebben NewSlot , niet alle methoden met het NewSlot kenmerk worden gedeclareerd met new of Shadows.

Van toepassing op