Delegate.CreateDelegate, méthode (Type, Object, MethodInfo, Boolean) (System)

Bibliothèque de classes .NET Framework 
Delegate.CreateDelegate, méthode (Type, Object, MethodInfo, Boolean) 

Remarque : cette méthode est nouvelle dans le .NET Framework version 2.0.

Crée un délégué du type spécifié qui représente la méthode statique ou d'instance spécifiée, avec le premier argument spécifié et le comportement spécifié en cas d'échec de la liaison.

Espace de noms : System
Assembly : mscorlib (dans mscorlib.dll)

SyntaxeSyntaxe


Visual Basic (Déclaration)
Public Shared Function CreateDelegate ( _
    type As Type, _
    firstArgument As Object, _
    method As MethodInfo, _
    throwOnBindFailure As Boolean _
) As Delegate


Visual Basic (Utilisation)
Dim type As Type
Dim firstArgument As Object
Dim method As MethodInfo
Dim throwOnBindFailure As Boolean
Dim returnValue As Delegate

returnValue = Delegate.CreateDelegate(type, firstArgument, method, throwOnBindFailure)


C#
public static Delegate CreateDelegate (
    Type type,
    Object firstArgument,
    MethodInfo method,
    bool throwOnBindFailure
)


C++
public:
static Delegate^ CreateDelegate (
    Type^ type, 
    Object^ firstArgument, 
    MethodInfo^ method, 
    bool throwOnBindFailure
)


J#
public static Delegate CreateDelegate (
    Type type, 
    Object firstArgument, 
    MethodInfo method, 
    boolean throwOnBindFailure
)


JScript
public static function CreateDelegate (
    type : Type, 
    firstArgument : Object, 
    method : MethodInfo, 
    throwOnBindFailure : boolean
) : Delegate

Paramètres

type

Type représentant le type de délégué à créer.

firstArgument

Object qui est le premier argument de la méthode que le délégué représente. Pour les méthodes d'instance, il doit être compatible avec le type d'instance.

method

MethodInfo décrivant la méthode statique ou d'instance que le délégué doit représenter.

throwOnBindFailure

true pour lever une exception si method ne peut pas être liée ; sinon false.

Valeur de retour

Délégué du type spécifié qui représente la méthode statique ou d'instance spécifiée, ou référence Null (Nothing en Visual Basic) si throwOnBindFailure est false et que le délégué ne peut pas être lié à method.
ExceptionsExceptions
Type d'exceptionCondition

ArgumentNullException

type est référence Null (Nothing en Visual Basic).

- ou -

method est référence Null (Nothing en Visual Basic).

ArgumentException

type n'hérite pas de MulticastDelegate.

- ou -

type n'est pas RuntimeType. Consultez Types au moment de l'exécution dans la réflexion.

- ou -

method ne peut pas être liée, et throwOnBindFailure est true.

- ou -

method n'est pas RuntimeMethodInfo. Consultez Types au moment de l'exécution dans la réflexion.

MissingMethodException

La méthode Invoke de type est introuvable.

MethodAccessException

L'appelant ne dispose pas des autorisations nécessaires pour accéder à method.

NotesNotes

Cette surcharge de méthode et la surcharge de méthode CreateDelegate(Type,Object,MethodInfo), qui lèvent toujours une exception en cas d'échec de la liaison, offrent le moyen le plus souple de créer des délégués. Vous pouvez les utiliser pour créer des délégués pour les méthodes statiques ou d'instance, avec ou sans un premier argument.

RemarqueRemarque

Si vous ne fournissez pas de premier argument, utilisez la surcharge de méthode CreateDelegate(Type,MethodInfo,Boolean) pour obtenir de meilleures performances.

Le type de délégué et la méthode doivent avoir des types de retour compatibles. Autrement dit, le type de retour de method doit pouvoir être assigné au type de retour de type.

Si firstArgument est fourni, il est passé à method chaque fois que le délégué est appelé ; on dit alors que firstArgument est lié au délégué et que le délégué est fermé sur son premier argument. Si method est static (Shared en Visual Basic), la liste d'arguments fournie lors de l'appel au délégué inclut tous les paramètres à l'exception du premier ; si method est une méthode d'instance, firstArgument est passé au paramètre d'instance masqué (représenté par this en C# ou par Me en Visual Basic).

Si firstArgument est fourni, le premier paramètre de method doit être un type référence, et firstArgument doit être compatible avec ce type.

RemarqueImportant :

Si method est static (Shared en Visual Basic) et que son premier paramètre est de type Object ou ValueType, firstArgument peut être un type valeur. Dans ce cas, firstArgument est automatiquement boxed. La conversion boxing automatique ne se produit pas pour les autres arguments, comme ce serait le cas dans un appel de fonction C# ou Visual Basic.

Si firstArgument est une référence null et que method est une méthode d'instance, le résultat dépend des signatures du type du type de délégué et de method:

  • Si la signature de type inclut explicitement le premier paramètre masqué de method, le délégué est dit représenter une méthode d'instance ouverte. Lorsque le délégué est appelé, le premier argument de la liste d'arguments est passé au paramètre d'instance masqué de method.

  • Si les signatures de method et type correspondent (autrement dit, tous les types de paramètre sont compatibles), le délégué est dit être fermé sur une référence null. Faire appel à un délégué revient à appeler une méthode d'instance sur une instance null, ce qui n'est pas particulièrement utile.

Si firstArgument est une référence null et que method est statique, le résultat dépend des signatures du type du type de délégué et de method:

  • Si les signatures de method et de type correspondent, (autrement dit, tous les types de paramètre sont compatibles), le délégué est dit représenter une méthode statique ouverte. C'est le cas le plus commun pour les méthodes statiques. Dans ce cas, vous pouvez obtenir des performances légèrement meilleures en utilisant la surcharge de méthode CreateDelegate(Type,MethodInfo,Boolean).

  • Si la signature de type commence par le deuxième paramètre de method et que le reste des types de paramètre est compatible, le délégué est dit être fermé sur une référence null. Lorsque le délégué est appelé, une référence null est passée au premier paramètre de method.

Type de retour et types de paramètre compatibles

Les types de paramètre et le type de retour d'un délégué doivent être compatibles avec les types de paramètre et le type de retour de la méthode que le délégué représente ; les types ne doivent pas correspondre exactement.

RemarqueRemarque

Dans les versions 1.0 et 1.1 du .NET Framework, les types doivent correspondre exactement.

Un paramètre de délégué est compatible avec le paramètre correspondant d'une méthode si le type du paramètre de délégué est plus restrictif que le type du paramètre de méthode, parce que cela garantit qu'un argument passé au délégué peut être transmis sans risque à la méthode.

De la même façon, le type de retour d'un délégué est compatible avec le type de retour d'une méthode si le type de retour de la méthode est plus restrictif que le type de retour du délégué, parce que cela garantit que la valeur de retour de la méthode peut être castée sans risque au type de retour du délégué.

Par exemple, un délégué avec un paramètre de type Hashtable et un type de retour de Object peut représenter une méthode avec un paramètre de type Object et une valeur de retour de type Hashtable.

Détermination des méthodes qu'un délégué peut représenter

Une autre façon utile de penser à la souplesse de cette surcharge de CreateDelegate est qu'un délégué donné peut représenter quatre combinaisons différentes de signature de méthode et de type de méthode (statique contre instance). Considérez un type de délégué D avec un argument de type C. Les éléments suivants décrivent les méthodes que D peut représenter, en ignorant le type de retour puisqu'il doit correspondre dans tous les cas :

  • D peut représenter toute méthode d'instance ayant exactement un argument de type C, indépendamment du type auquel la méthode d'instance appartient. Lorsque CreateDelegate est appelé, firstArgument est une instance du type auquel method appartient et le délégué obtenu est dit être fermé sur cette instance. (Plus simplement, D peut aussi être fermé sur une référence null si firstArgument est référence Null (Nothing en Visual Basic).)

  • D peut représenter une méthode d'instance de C qui n'a pas d'arguments. Lorsque CreateDelegate est appelé, firstArgument est une référence null. Le délégué obtenu représente une méthode d'instance ouverte, et une instance de C doit être fournie à chacun de ses appels.

  • D peut représenter une méthode statique qui prend un argument de type C, et cette méthode peut appartenir à n'importe quel type. Lorsque CreateDelegate est appelé, firstArgument est une référence null. Le délégué obtenu représente une méthode statique ouverte, et une instance de C doit être fournie à chacun de ses appels.

  • D peut représenter une méthode statique appartenant au type F et possédant deux arguments, de type F et de type C. Lorsque CreateDelegate est appelé, firstArgument est une instance de F. Le délégué obtenu représente une méthode statique fermée sur cette instance de F. Notez que dans le cas où F et C sont du même type, la méthode statique a deux arguments de ce type. (Dans ce cas, D est fermé sur une référence null si firstArgument est référence Null (Nothing en Visual Basic).)

ExempleExemple

Cette section contient trois exemples de code. Le premier exemple illustre les quatre types de délégués qui peuvent être créés, fermés sur une méthode d'instance, ouverts sur une méthode d'instance, ouverts sur une méthode statique ou fermés sur une méthode statique.

Le deuxième exemple de code illustre des types de retour et des types de paramètre compatibles.

Le troisième exemple de code définit un type délégué simple et affiche toutes les méthodes que le type délégué peut représenter.

Exemple 1

L'exemple de code suivant illustre les quatre façons dont un délégué peut être créé à l'aide de cette surcharge de la méthode CreateDelegate.

RemarqueRemarque

Il y a deux surcharges de la méthode CreateDelegate qui spécifient un firstArgument et un MethodInfo ; leurs fonctionnalités sont les mêmes, si ce n'est que l'une vous permet de spécifier si une exception doit être levée en cas d'échec de la liaison, et que l'autre lève toujours une exception. Cet exemple de code utilise les deux surcharges.

L'exemple déclare une classe C avec une méthode statique M2 et une méthode d'instance de M1, et trois types délégués : D1 prend une instance de C et une chaîne, D2 prend une chaîne et D3 n'a pas arguments.

Une deuxième classe nommée Example contient le code qui crée les délégués.

  • Un délégué de type D2, fermé sur une instance de C, est créé pour la méthode d'instance de M1. Il est appelé avec différentes chaînes, pour montrer que l'instance liée de C est toujours utilisée.

  • Un délégué de type D1, représentant une méthode d'instance ouverte, est créé pour la méthode d'instance de M1. Une instance doit être passée lorsque le délégué est appelé.

  • Un délégué de type D2, représentant une méthode statique ouverte, est créé pour la méthode statique M2.

  • Enfin, un délégué de type D3, fermé sur une chaîne, est créé pour la méthode statique M2. La méthode est appelée pour illustrer l'utilisation de la chaîne liée.



Visual Basic
Imports System
Imports System.Reflection
Imports System.Security.Permissions

' Declare three delegate types for demonstrating the combinations
' of Shared versus instance methods and open versus closed
' delegates.
'
Public Delegate Sub D1(ByVal c As C, ByVal s As String) 
Public Delegate Sub D2(ByVal s As String) 
Public Delegate Sub D3() 

' A sample class with an instance method and a Shared method.
'
Public Class C
    Private id As Integer
    Public Sub New(ByVal id As Integer) 
        Me.id = id
    End Sub 'New

    Public Sub M1(ByVal s As String) 
        Console.WriteLine("Instance method M1 on C:  id = {0}, s = {1}", _
            Me.id, s)
    End Sub
    
    Public Shared Sub M2(ByVal s As String) 
        Console.WriteLine("Shared method M2 on C:  s = {0}", s)
    End Sub
End Class

Public Class Example
    
    Public Shared Sub Main() 

        Dim c1 As New C(42)
        
        ' Get a MethodInfo for each method.
        '
        Dim mi1 As MethodInfo = GetType(C).GetMethod("M1", _
            BindingFlags.Public Or BindingFlags.Instance)
        Dim mi2 As MethodInfo = GetType(C).GetMethod("M2", _
            BindingFlags.Public Or BindingFlags.Static)
        
        Dim d1 As D1
        Dim d2 As D2
        Dim d3 As D3
        
        
        Console.WriteLine(vbLf & "An instance method closed over C.")
        ' In this case, the delegate and the
        ' method must have the same list of argument types; use
        ' delegate type D2 with Shared method M1.
        '
        Dim test As [Delegate] = _
            [Delegate].CreateDelegate(GetType(D2), c1, mi1, False)

        ' Because False was specified for throwOnBindFailure 
        ' in the call to CreateDelegate, the variable 'test'
        ' contains Nothing if the method fails to bind (for 
        ' example, if mi1 happened to represent a method of 
        ' some class other than C).
        '
        If test IsNot Nothing Then
            d2 = CType(test, D2)

            ' The same instance of C is used every time the
            ' delegate is invoked.
            d2("Hello, World!")
            d2("Hi, Mom!")
        End If
        
        
        Console.WriteLine(vbLf & "An open instance method.")
        ' In this case, the delegate has one more 
        ' argument than the instance method; this argument comes
        ' at the beginning, and represents the hidden instance
        ' argument of the instance method. Use delegate type D1
        ' with instance method M1.
        '
        d1 = CType([Delegate].CreateDelegate(GetType(D1), Nothing, mi1), D1)
        
        ' An instance of C must be passed in each time the 
        ' delegate is invoked.
        '
        d1(c1, "Hello, World!")
        d1(New C(5280), "Hi, Mom!")
        
        
        Console.WriteLine(vbLf & "An open Shared method.")
        ' In this case, the delegate and the method must 
        ' have the same list of argument types; use delegate type
        ' D2 with Shared method M2.
        '
        d2 = CType([Delegate].CreateDelegate(GetType(D2), Nothing, mi2), D2)
        
        ' No instances of C are involved, because this is a Shared
        ' method. 
        '
        d2("Hello, World!")
        d2("Hi, Mom!")
        
        
        Console.WriteLine(vbLf & "A Shared method closed over the first argument (String).")
        ' The delegate must omit the first argument of the method.
        ' A string is passed as the firstArgument parameter, and 
        ' the delegate is bound to this string. Use delegate type 
        ' D3 with Shared method M2. 
        '
        d3 = CType([Delegate].CreateDelegate(GetType(D3), "Hello, World!", mi2), D3)
        
        ' Each time the delegate is invoked, the same string is
        ' used.
        d3()
    
    End Sub
End Class

' This code example produces the following output:
'
'An instance method closed over C.
'Instance method M1 on C:  id = 42, s = Hello, World!
'Instance method M1 on C:  id = 42, s = Hi, Mom!
'
'An open instance method.
'Instance method M1 on C:  id = 42, s = Hello, World!
'Instance method M1 on C:  id = 5280, s = Hi, Mom!
'
'An open Shared method.
'Shared method M2 on C:  s = Hello, World!
'Shared method M2 on C:  s = Hi, Mom!
'
'A Shared method closed over the first argument (String).
'Shared method M2 on C:  s = Hello, World!
' 


C#
using System;
using System.Reflection;
using System.Security.Permissions;

// Declare three delegate types for demonstrating the combinations
// of static versus instance methods and open versus closed
// delegates.
//
public delegate void D1(C c, string s);
public delegate void D2(string s);
public delegate void D3();

// A sample class with an instance method and a static method.
//
public class C
{
    private int id;
    public C(int id) { this.id = id; }

    public void M1(string s) 
    { 
        Console.WriteLine("Instance method M1 on C:  id = {0}, s = {1}",
            this.id, s);
    }
  
    public static void M2(string s)
    { 
        Console.WriteLine("Static method M2 on C:  s = {0}", s); 
    }
}

public class Example
{
    public static void Main()
    {
        C c1 = new C(42);

        // Get a MethodInfo for each method.
        //
        MethodInfo mi1 = typeof(C).GetMethod("M1", 
            BindingFlags.Public | BindingFlags.Instance);
        MethodInfo mi2 = typeof(C).GetMethod("M2",
            BindingFlags.Public | BindingFlags.Static);

        D1 d1;
        D2 d2;
        D3 d3;


        Console.WriteLine("\nAn instance method closed over C.");
        // In this case, the delegate and the
        // method must have the same list of argument types; use
        // delegate type D2 with static method M1.
        //
        Delegate test = 
            Delegate.CreateDelegate(typeof(D2), c1, mi1, false);

        // Because false was specified for throwOnBindFailure 
        // in the call to CreateDelegate, the variable 'test'
        // contains null if the method fails to bind (for 
        // example, if mi1 happened to represent a method of  
        // some class other than C).
        //
        if (test != null)
        {
            d2 = (D2) test;

            // The same instance of C is used every time the 
            // delegate is invoked.
            d2("Hello, World!");
            d2("Hi, Mom!");
        }


        Console.WriteLine("\nAn open instance method.");
        // In this case, the delegate has one more 
        // argument than the instance method; this argument comes
        // at the beginning, and represents the hidden instance
        // argument of the instance method. Use delegate type D1
        // with instance method M1.
        //
        d1 = (D1) Delegate.CreateDelegate(typeof(D1), null, mi1);

        // An instance of C must be passed in each time the 
        // delegate is invoked.
        //
        d1(c1, "Hello, World!");
        d1(new C(5280), "Hi, Mom!");


        Console.WriteLine("\nAn open static method.");
        // In this case, the delegate and the method must 
        // have the same list of argument types; use delegate type
        // D2 with static method M2.
        //
        d2 = (D2) Delegate.CreateDelegate(typeof(D2), null, mi2);

        // No instances of C are involved, because this is a static
        // method. 
        //
        d2("Hello, World!");
        d2("Hi, Mom!");


        Console.WriteLine("\nA static method closed over the first argument (String).");
        // The delegate must omit the first argument of the method.
        // A string is passed as the firstArgument parameter, and 
        // the delegate is bound to this string. Use delegate type 
        // D3 with static method M2. 
        //
        d3 = (D3) Delegate.CreateDelegate(typeof(D3), 
            "Hello, World!", mi2);

        // Each time the delegate is invoked, the same string is
        // used.
        d3();
    }
}

/* This code example produces the following output:

An instance method closed over C.
Instance method M1 on C:  id = 42, s = Hello, World!
Instance method M1 on C:  id = 42, s = Hi, Mom!

An open instance method.
Instance method M1 on C:  id = 42, s = Hello, World!
Instance method M1 on C:  id = 5280, s = Hi, Mom!

An open static method.
Static method M2 on C:  s = Hello, World!
Static method M2 on C:  s = Hi, Mom!

A static method closed over the first argument (String).
Static method M2 on C:  s = Hello, World!
 */

Exemple 2

L'exemple de code suivant illustre la compatibilité des types de paramètre et des types de retour.

RemarqueRemarque

Cet exemple de code utilise la surcharge de méthode CreateDelegate(Type,MethodInfo). L'utilisation d'autres surcharges qui prennent MethodInfo est similaire.

L'exemple de code définit une classe de base nommée Base et une classe nommée Derived qui dérive de Base. La classe dérivée possède une méthode staticShared en Visual Basic) nommée MyMethod avec un paramètre de type Base et un type de retour de Derived. L'exemple de code définit également un délégué nommé Example qui a un paramètre de type Derived et un type de retour de Base.

L'exemple de code montre que le délégué nommé Example peut être utilisé pour représenter la méthode MyMethod. La méthode peut être liée au délégué parce que :

  • Le type de paramètre du délégué (Derived) est plus restrictif que le type de paramètre de MyMethod (Base), de telle sorte que la transmission de l'argument du délégué à MyMethod est toujours sécurisée.

  • Le type de retour de MyMethod (Derived) est plus restrictif que le type de paramètre du délégué (Base), de telle sorte que l'exécution d'un cast du type de retour de la méthode en type de retour du délégué est toujours sécurisée.

L'exemple de code ne génère aucune sortie.



Visual Basic
Imports System
Imports System.Reflection

' Define two classes to use in the demonstration, a base class and 
' a class that derives from it.
'
Public Class Base
End Class

Public Class Derived
    Inherits Base

    ' Define a Shared method to use in the demonstration. The method 
    ' takes an instance of Base and returns an instance of Derived.  
    ' For the purposes of the demonstration, it is not necessary for 
    ' the method to do anything useful. 
    '
    Public Shared Function MyMethod(ByVal arg As Base) As Derived
        Dim dummy As Base = arg
        Return New Derived()
    End Function

End Class

' Define a delegate that takes an instance of Derived and returns an
' instance of Base.
'
Public Delegate Function Example(ByVal arg As Derived) As Base

Module Test

    Sub Main()

        ' The binding flags needed to retrieve MyMethod.
        Dim flags As BindingFlags = _
            BindingFlags.Public Or BindingFlags.Static

        ' Get a MethodInfo that represents MyMethod.
        Dim minfo As MethodInfo = _
            GetType(Derived).GetMethod("MyMethod", flags)

        ' Demonstrate covariance of parameter types and contravariance
        ' of return types by using the delegate Example to represent
        ' MyMethod. The delegate binds to the method because the
        ' parameter of the delegate is more restrictive than the 
        ' parameter of the method (that is, the delegate accepts an
        ' instance of Derived, which can always be safely passed to
        ' a parameter of type Base), and the return type of MyMethod
        ' is more restrictive than the return type of Example (that
        ' is, the method returns an instance of Derived, which can
        ' always be safely cast to type Base). 
        '
        Dim ex As Example = CType( _
            [Delegate].CreateDelegate(GetType(Example), minfo), _
            Example _
        )

        ' Execute MyMethod using the delegate Example.
        '        
        Dim b As Base = ex(New Derived())
    End Sub
End Module


C#
using System;
using System.Reflection;

// Define two classes to use in the demonstration, a base class and 
// a class that derives from it.
//
public class Base {}

public class Derived : Base
{
    // Define a static method to use in the demonstration. The method 
    // takes an instance of Base and returns an instance of Derived.  
    // For the purposes of the demonstration, it is not necessary for 
    // the method to do anything useful. 
    //
    public static Derived MyMethod(Base arg)
    {
        Base dummy = arg;
        return new Derived();
    }
}

// Define a delegate that takes an instance of Derived and returns an
// instance of Base.
//
public delegate Base Example(Derived arg);

class Test
{
    public static void Main()
    {
        // The binding flags needed to retrieve MyMethod.
        BindingFlags flags = BindingFlags.Public | BindingFlags.Static;

        // Get a MethodInfo that represents MyMethod.
        MethodInfo minfo = typeof(Derived).GetMethod("MyMethod", flags);

        // Demonstrate covariance of parameter types and contravariance
        // of return types by using the delegate Example to represent
        // MyMethod. The delegate binds to the method because the
        // parameter of the delegate is more restrictive than the 
        // parameter of the method (that is, the delegate accepts an
        // instance of Derived, which can always be safely passed to
        // a parameter of type Base), and the return type of MyMethod
        // is more restrictive than the return type of Example (that
        // is, the method returns an instance of Derived, which can
        // always be safely cast to type Base). 
        //
        Example ex = 
            (Example) Delegate.CreateDelegate(typeof(Example), minfo);

        // Execute MyMethod using the delegate Example.
        //        
        Base b = ex(new Derived());
    }
}


C++
using namespace System;
using namespace System::Reflection;

// Define two classes to use in the demonstration, a base class and 
// a class that derives from it.
//
public ref class Base {};

public ref class Derived : Base
{
    // Define a static method to use in the demonstration. The method 
    // takes an instance of Base and returns an instance of Derived.  
    // For the purposes of the demonstration, it is not necessary for 
    // the method to do anything useful. 
    //
public:
    static Derived^ MyMethod(Base^ arg)
    {
        Base^ dummy = arg;
        return gcnew Derived();
    }
};

// Define a delegate that takes an instance of Derived and returns an
// instance of Base.
//
public delegate Base^ Example(Derived^ arg);

void main()
{
    // The binding flags needed to retrieve MyMethod.
    BindingFlags flags = BindingFlags::Public | BindingFlags::Static;

    // Get a MethodInfo that represents MyMethod.
    MethodInfo^ minfo = Derived::typeid->GetMethod("MyMethod", flags);

    // Demonstrate covariance of parameter types and contravariance
    // of return types by using the delegate Example to represent
    // MyMethod. The delegate binds to the method because the
    // parameter of the delegate is more restrictive than the 
    // parameter of the method (that is, the delegate accepts an
    // instance of Derived, which can always be safely passed to
    // a parameter of type Base), and the return type of MyMethod
    // is more restrictive than the return type of Example (that
    // is, the method returns an instance of Derived, which can
    // always be safely cast to type Base). 
    //
    Example^ ex = 
        (Example^) Delegate::CreateDelegate(Example::typeid, minfo);

    // Execute MyMethod using the delegate Example.
    //        
    Base^ b = ex(gcnew Derived());
}

Exemple 3

L'exemple de code suivant illustre toutes les méthodes qu'un type délégué simple peut représenter.

RemarqueRemarque

Il y a deux surcharges de la méthode CreateDelegate qui spécifient un firstArgument et un MethodInfo ; leurs fonctionnalités sont les mêmes, si ce n'est que l'une vous permet de spécifier si une exception doit être levée en cas d'échec de la liaison, et que l'autre lève toujours une exception. Cet exemple de code utilise les deux surcharges.

L'exemple de code définit deux classes, C et F, et un type délégué D avec un argument de type C. Les classes possèdent des méthodes statiques et d'instance correspondantes, M1, M3 et M4, et la classe C possède aussi une méthode d'instance de M2 qui n'a pas d'arguments.

Une troisième classe nommée Example contient le code qui crée les délégués.

  • Les délégués sont créés pour une méthode d'instance de M1 de type C et de type F ; chacun est fermé sur une instance du type respectif. La méthode M1 de type C affiche les propriétés ID de l'instance liée et de l'argument.

  • Un délégué est créé pour la méthode M2 de type C. Il s'agit d'un délégué d'instance ouvert, dans lequel l'argument du délégué représente le premier argument masqué de la méthode d'instance. La méthode n'a aucun autre argument.

  • Les délégués sont créés pour la méthode statique M3 de type C et type F ; ce sont des délégués statiques ouverts.

  • Enfin, les délégués sont créés pour la méthode statique M4 de type C et type F ; comme chaque méthode a le type déclarant comme premier argument et qu'une instance du type est fournie, les délégués sont fermés sur leurs premiers arguments. La méthode M4 de type C affiche les propriétés ID de l'instance liée et de l'argument.



Visual Basic
Imports System
Imports System.Reflection
Imports System.Security.Permissions

' Declare a delegate type. The object of this code example
' is to show all the methods this delegate can bind to.
'
Public Delegate Sub D(ByVal c As C) 

' Declare two sample classes, C and F. Class C has an ID
' property so instances can be identified.
'
Public Class C

    Private _id As Integer

    Public ReadOnly Property ID() As Integer 
        Get
            Return _id
        End Get
    End Property

    Public Sub New(ByVal newId As Integer) 
        Me._id = newId
    End Sub
    
    Public Sub M1(ByVal c As C) 
        Console.WriteLine("Instance method M1(c As C) on C:  this.id = {0}, c.ID = {1}", _
            Me.id, c.ID)
    End Sub
    
    Public Sub M2() 
        Console.WriteLine("Instance method M2() on C:  this.id = {0}", Me.id)
    End Sub
    
    Public Shared Sub M3(ByVal c As C) 
        Console.WriteLine("Shared method M3(c As C) on C:  c.ID = {0}", c.ID)
    End Sub
    
    Public Shared Sub M4(ByVal c1 As C, ByVal c2 As C) 
        Console.WriteLine("Shared method M4(c1 As C, c2 As C) on C:  c1.ID = {0}, c2.ID = {1}", _
            c1.ID, c2.ID)
    End Sub
End Class


Public Class F
    
    Public Sub M1(ByVal c As C) 
        Console.WriteLine("Instance method M1(c As C) on F:  c.ID = {0}", c.ID)
    End Sub
    
    Public Shared Sub M3(ByVal c As C) 
        Console.WriteLine("Shared method M3(c As C) on F:  c.ID = {0}", c.ID)
    End Sub
    
    Public Shared Sub M4(ByVal f As F, ByVal c As C) 
        Console.WriteLine("Shared method M4(f As F, c As C) on F:  c.ID = {0}", c.ID)
    End Sub
End Class

Public Class Example
    
    Public Shared Sub Main() 

        Dim c1 As New C(42)
        Dim c2 As New C(1491)
        Dim f1 As New F()
        
        Dim d As D
        
        ' Instance method with one argument of type C.
        Dim cmi1 As MethodInfo = GetType(C).GetMethod("M1")
        ' Instance method with no arguments.
        Dim cmi2 As MethodInfo = GetType(C).GetMethod("M2")
        ' Shared method with one argument of type C.
        Dim cmi3 As MethodInfo = GetType(C).GetMethod("M3")
        ' Shared method with two arguments of type C.
        Dim cmi4 As MethodInfo = GetType(C).GetMethod("M4")
        
        ' Instance method with one argument of type C.
        Dim fmi1 As MethodInfo = GetType(F).GetMethod("M1")
        ' Shared method with one argument of type C.
        Dim fmi3 As MethodInfo = GetType(F).GetMethod("M3")
        ' Shared method with an argument of type F and an 
        ' argument of type C.
        Dim fmi4 As MethodInfo = GetType(F).GetMethod("M4")
        
        Console.WriteLine(vbLf & "An instance method on any type, with an argument of type C.")
        ' D can represent any instance method that exactly matches its
        ' signature. Methods on C and F are shown here.
        '
        d = CType([Delegate].CreateDelegate(GetType(D), c1, cmi1), D)
        d(c2)
        d = CType([Delegate].CreateDelegate(GetType(D), f1, fmi1), D)
        d(c2)
        
        Console.WriteLine(vbLf & "An instance method on C with no arguments.")
        ' D can represent an instance method on C that has no arguments;
        ' in this case, the argument of D represents the hidden first
        ' argument of any instance method. The delegate acts like a 
        ' Shared method, and an instance of C must be passed each time
        ' it is invoked.
        '
        d = CType([Delegate].CreateDelegate(GetType(D), Nothing, cmi2), D)
        d(c1)
        
        Console.WriteLine(vbLf & "A Shared method on any type, with an argument of type C.")
        ' D can represent any Shared method with the same signature.
        ' Methods on F and C are shown here.
        '
        d = CType([Delegate].CreateDelegate(GetType(D), Nothing, cmi3), D)
        d(c1)
        d = CType([Delegate].CreateDelegate(GetType(D), Nothing, fmi3), D)
        d(c1)
        
        Console.WriteLine(vbLf & "A Shared method on any type, with an argument of")
        Console.WriteLine("    that type and an argument of type C.")
        ' D can represent any Shared method with one argument of the
        ' type the method belongs and a second argument of type C.
        ' In this case, the method is closed over the instance of
        ' supplied for the its first argument, and acts like an instance
        ' method. Methods on F and C are shown here.
        '
        d = CType([Delegate].CreateDelegate(GetType(D), c1, cmi4), D)
        d(c2)
        Dim test As [Delegate] = _
            [Delegate].CreateDelegate(GetType(D), f1, fmi4, false)

        ' This final example specifies False for throwOnBindFailure 
        ' in the call to CreateDelegate, so the variable 'test'
        ' contains Nothing if the method fails to bind (for 
        ' example, if fmi4 happened to represent a method of  
        ' some class other than F).
        '
        If test IsNot Nothing Then
            d = CType(test, D)
            d(c2)
        End If
    
    End Sub
End Class

' This code example produces the following output:
'
'An instance method on any type, with an argument of type C.
'Instance method M1(c As C) on C:  this.id = 42, c.ID = 1491
'Instance method M1(c As C) on F:  c.ID = 1491
'
'An instance method on C with no arguments.
'Instance method M2() on C:  this.id = 42
'
'A Shared method on any type, with an argument of type C.
'Shared method M3(c As C) on C:  c.ID = 42
'Shared method M3(c As C) on F:  c.ID = 42
'
'A Shared method on any type, with an argument of
'    that type and an argument of type C.
'Shared method M4(c1 As C, c2 As C) on C:  c1.ID = 42, c2.ID = 1491
'Shared method M4(f As F, c As C) on F:  c.ID = 1491
'


C#
using System;
using System.Reflection;
using System.Security.Permissions;

// Declare a delegate type. The object of this code example
// is to show all the methods this delegate can bind to.
//
public delegate void D(C c);

// Declare two sample classes, C and F. Class C has an ID
// property so instances can be identified.
//
public class C
{
    private int id;
    public int ID { get { return id; }}
    public C(int id) { this.id = id; }

    public void M1(C c) 
    { 
        Console.WriteLine("Instance method M1(C c) on C:  this.id = {0}, c.ID = {1}",
            this.id, c.ID);
    }
  
    public void M2() 
    { 
        Console.WriteLine("Instance method M2() on C:  this.id = {0}",
            this.id);
    }
  
    public static void M3(C c)
    { 
        Console.WriteLine("Static method M3(C c) on C:  c.ID = {0}", c.ID); 
    }

    public static void M4(C c1, C c2) 
    { 
        Console.WriteLine("Static method M4(C c1, C c2) on C:  c1.ID = {0}, c2.ID = {1}",
            c1.ID, c2.ID);
    }
}

public class F
{
    public void M1(C c) 
    { 
        Console.WriteLine("Instance method M1(C c) on F:  c.ID = {0}",
            c.ID);
    }
  
    public static void M3(C c)
    { 
        Console.WriteLine("Static method M3(C c) on F:  c.ID = {0}", c.ID); 
    }

    public static void M4(F f, C c) 
    { 
        Console.WriteLine("Static method M4(F f, C c) on F:  c.ID = {0}",
            c.ID);
    }
}


public class Example
{
    public static void Main()
    {
        C c1 = new C(42);
        C c2 = new C(1491);
        F f1 = new F();

        D d;

        // Instance method with one argument of type C.
        MethodInfo cmi1 = typeof(C).GetMethod("M1"); 
        // Instance method with no arguments.
        MethodInfo cmi2 = typeof(C).GetMethod("M2"); 
        // Static method with one argument of type C.
        MethodInfo cmi3 = typeof(C).GetMethod("M3"); 
        // Static method with two arguments of type C.
        MethodInfo cmi4 = typeof(C).GetMethod("M4"); 

        // Instance method with one argument of type C.
        MethodInfo fmi1 = typeof(F).GetMethod("M1");
        // Static method with one argument of type C.
        MethodInfo fmi3 = typeof(F).GetMethod("M3"); 
        // Static method with an argument of type F and an argument 
        // of type C.
        MethodInfo fmi4 = typeof(F).GetMethod("M4"); 

        Console.WriteLine("\nAn instance method on any type, with an argument of type C.");
        // D can represent any instance method that exactly matches its
        // signature. Methods on C and F are shown here.
        //
        d = (D) Delegate.CreateDelegate(typeof(D), c1, cmi1);
        d(c2);
        d = (D) Delegate.CreateDelegate(typeof(D), f1, fmi1);
        d(c2);

        Console.WriteLine("\nAn instance method on C with no arguments.");
        // D can represent an instance method on C that has no arguments;
        // in this case, the argument of D represents the hidden first
        // argument of any instance method. The delegate acts like a 
        // static method, and an instance of C must be passed each time
        // it is invoked.
        //
        d = (D) Delegate.CreateDelegate(typeof(D), null, cmi2);
        d(c1);

        Console.WriteLine("\nA static method on any type, with an argument of type C.");
        // D can represent any static method with the same signature.
        // Methods on F and C are shown here.
        //
        d = (D) Delegate.CreateDelegate(typeof(D), null, cmi3);
        d(c1);
        d = (D) Delegate.CreateDelegate(typeof(D), null, fmi3);
        d(c1);

        Console.WriteLine("\nA static method on any type, with an argument of");
        Console.WriteLine("    that type and an argument of type C.");
        // D can represent any static method with one argument of the
        // type the method belongs and a second argument of type C.
        // In this case, the method is closed over the instance of
        // supplied for the its first argument, and acts like an instance
        // method. Methods on F and C are shown here.
        //
        d = (D) Delegate.CreateDelegate(typeof(D), c1, cmi4);
        d(c2);
        Delegate test = 
            Delegate.CreateDelegate(typeof(D), f1, fmi4, false);

        // This final example specifies false for throwOnBindFailure 
        // in the call to CreateDelegate, so the variable 'test'
        // contains Nothing if the method fails to bind (for 
        // example, if fmi4 happened to represent a method of  
        // some class other than F).
        //
        if (test != null)
        {
            d = (D) test;
            d(c2);
        }
    }
}

/* This code example produces the following output:

An instance method on any type, with an argument of type C.
Instance method M1(C c) on C:  this.id = 42, c.ID = 1491
Instance method M1(C c) on F:  c.ID = 1491

An instance method on C with no arguments.
Instance method M2() on C:  this.id = 42

A static method on any type, with an argument of type C.
Static method M3(C c) on C:  c.ID = 42
Static method M3(C c) on F:  c.ID = 42

A static method on any type, with an argument of
    that type and an argument of type C.
Static method M4(C c1, C c2) on C:  c1.ID = 42, c2.ID = 1491
Static method M4(F f, C c) on F:  c.ID = 1491
*/
Sécurité .NET FrameworkSécurité .NET Framework
Plates-formesPlates-formes

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Édition Media Center, Windows XP Professionnel Édition x64, Windows XP SP2, Windows XP Starter Edition

Le .NET Framework ne prend pas en charge toutes les versions de chaque plate-forme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise.

Informations de versionInformations de version

.NET Framework

Prise en charge dans : 2.0
Voir aussiVoir aussi

Ces informations proviennent du site de http://msdn2.microsoft.com
Source de cette page : http://msdn2.microsoft.com/fr-fr/library/s3860fy3.aspx

Réseaux sociaux

Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher les interactions avec les réseaux sociaux sur ces pages.

 

Nuage de mots clés

11 mots clés dont 0 définis manuellement (plus d'information...).

Avertissement

Cette page ne possède pas encore de mots clés manuels, ceci est donc un exemple automatique (les niveaux de pertinence sont fictifs, mais les liens sont valables). Pour tester le nuage avec une page qui contient des mots définis manuellement, vous pouvez cliquer ici.

Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher le nuage de mots clés.

 

Astuce pour imprimer les couleurs des cellules de tableaux : http://www.gaudry.be/ast-rf-450.html
Aucun commentaire pour cette page

© Ce document issu de l′infobrol est enregistré sous le certificat Cyber PrInterDeposit Digital Numbertection. Enregistrement IDDN n° 5329-4682
Document créé le 30/10/06 00:23, dernière modification le Vendredi 17 Juin 2011, 12:11
Source du document imprimé : http://www.gaudry.be/dotnet-rf-s3860fy3.html Document affiché 3 fois ce mois de Mai.
St.Gaudry©07.01.02
Outils (masquer)
||
Recherche (afficher)
Recherche :

Utilisateur (masquer)
Navigation (masquer)
Apparence (afficher)
Stats (afficher)
15832 documents
452 astuces.
549 niouzes.
3099 definitions.
447 membres.
8115 messages.

Document genere en :
0,65 seconde

Mises à jour :
Mises à jour du site
Citation (masquer)
La distinction entre le vrai et le faux s'applique aux idées, non aux sentiments. Un sentiment peut être superficiel, il ne sera jamais menteur.

Arthur Koestler [Extrait de La corde raide]
 
l'infobrol
Nous sommes le Jeudi 31 Mai 2012, 18:46, toutes les heures sont au format GMT+1.00 Heure, heure d'été (+1)