MethodBase.Invoke Metoda

Definicja

Wywołuje metodę lub konstruktora odzwierciedlone przez to wystąpienie MethodInfo.Invokes the method or constructor reflected by this MethodInfo instance.

Przeciążenia

Invoke(Object, Object[])

Wywołuje metodę lub konstruktora reprezentowane przez bieżące wystąpienie przy użyciu określonych parametrów.Invokes the method or constructor represented by the current instance, using the specified parameters.

Invoke(Object, BindingFlags, Binder, Object[], CultureInfo)

Gdy jest zastępowany w klasie pochodnej, wywołuje odbitej metody lub konstruktora z podanym parametrem.When overridden in a derived class, invokes the reflected method or constructor with the given parameters.

Invoke(Object, Object[])

Wywołuje metodę lub konstruktora reprezentowane przez bieżące wystąpienie przy użyciu określonych parametrów.Invokes the method or constructor represented by the current instance, using the specified parameters.

public:
 virtual System::Object ^ Invoke(System::Object ^ obj, cli::array <System::Object ^> ^ parameters);
public:
 System::Object ^ Invoke(System::Object ^ obj, cli::array <System::Object ^> ^ parameters);
public virtual object Invoke (object obj, object[] parameters);
public object Invoke (object obj, object[] parameters);
abstract member Invoke : obj * obj[] -> obj
override this.Invoke : obj * obj[] -> obj
member this.Invoke : obj * obj[] -> obj
Public Overridable Function Invoke (obj As Object, parameters As Object()) As Object
Public Function Invoke (obj As Object, parameters As Object()) As Object

Parametry

obj
Object

Obiekt, dla którego ma zostać wywołana metoda lub Konstruktor.The object on which to invoke the method or constructor. Jeśli metoda jest statyczna, ten argument jest ignorowany.If a method is static, this argument is ignored. Jeśli Konstruktor jest statyczny, ten argument musi być null lub wystąpienie klasy, która definiuje konstruktora.If a constructor is static, this argument must be null or an instance of the class that defines the constructor.

parameters
Object[]

Lista argumentów dla wywołanej metody lub konstruktora.An argument list for the invoked method or constructor. Jest to tablica obiektów o tej samej liczbie, kolejności i typie co parametry metody lub konstruktora, które mają być wywoływane.This is an array of objects with the same number, order, and type as the parameters of the method or constructor to be invoked. Jeśli nie ma żadnych parametrów, parameters powinny być null.If there are no parameters, parameters should be null.

Jeśli metoda lub Konstruktor reprezentowane przez to wystąpienie przyjmuje parametr ref (ByRef w Visual Basic), nie jest wymagany żaden atrybut specjalny dla tego parametru, aby wywołać metodę lub Konstruktor przy użyciu tej funkcji.If the method or constructor represented by this instance takes a ref parameter (ByRef in Visual Basic), no special attribute is required for that parameter in order to invoke the method or constructor using this function. Każdy obiekt w tej tablicy, który nie jest jawnie zainicjowany przy użyciu wartości, będzie zawierać wartość domyślną dla tego typu obiektu.Any object in this array that is not explicitly initialized with a value will contain the default value for that object type. Dla elementów typu odwołania ta wartość jest null.For reference-type elements, this value is null. Dla elementów typu wartości ta wartość jest równa 0, 0,0 lub false, w zależności od typu określonego elementu.For value-type elements, this value is 0, 0.0, or false, depending on the specific element type.

Zwraca

Obiekt zawierający wartość zwracaną wywołanej metody lub null w przypadku konstruktora.An object containing the return value of the invoked method, or null in the case of a constructor.

Implementuje

Wyjątki

W programie.NET dla aplikacji ze sklepu Windows lub przenośnej biblioteki klasnależy przechwycić Exception zamiast tego.In the.NET for Windows Store apps or the Portable Class Library, catch Exception instead.

Parametr obj jest null i metoda nie jest statyczna.The obj parameter is null and the method is not static. — lub —-or- Metoda nie jest zadeklarowana ani dziedziczona przez klasę obj.The method is not declared or inherited by the class of obj. — lub —-or- Wywoływany jest Konstruktor statyczny, a obj nie jest ani null ani wystąpieniem klasy, która deklaruje Konstruktor.A static constructor is invoked, and obj is neither null nor an instance of the class that declared the constructor.

Elementy tablicy parameters nie pasują do sygnatury metody lub konstruktora odzwierciedlonej przez to wystąpienie.The elements of the parameters array do not match the signature of the method or constructor reflected by this instance.

Wywołana metoda lub Konstruktor zgłasza wyjątek.The invoked method or constructor throws an exception.

— lub —-or- Bieżące wystąpienie jest DynamicMethod, które zawiera kod niemożliwy do zweryfikowania.The current instance is a DynamicMethod that contains unverifiable code. Zapoznaj się z sekcją "weryfikacja" w temacie uwagi dotyczące DynamicMethod.See the "Verification" section in Remarks for DynamicMethod.

Tablica parameters nie ma poprawnej liczby argumentów.The parameters array does not have the correct number of arguments.

W programie .NET dla aplikacji ze sklepu Windows lub przenośnej biblioteki klasPrzechwyć wyjątek klasy bazowej, MemberAccessException, zamiast tego.In the .NET for Windows Store apps or the Portable Class Library, catch the base class exception, MemberAccessException, instead.

Obiekt wywołujący nie ma uprawnień do wykonania metody lub konstruktora reprezentowanego przez bieżące wystąpienie.The caller does not have permission to execute the method or constructor that is represented by the current instance.

Typ, który deklaruje metodę, jest otwartym typem ogólnym.The type that declares the method is an open generic type. Oznacza to, że właściwość ContainsGenericParameters zwraca true dla typu deklarującego.That is, the ContainsGenericParameters property returns true for the declaring type.

Bieżące wystąpienie jest MethodBuilder.The current instance is a MethodBuilder.

Przykłady

Poniższy przykład kodu demonstruje metodę dynamiczną Lookup przy użyciu odbicia.The following code example demonstrates dynamic method lookup using reflection. Należy zauważyć, że nie można użyć obiektu MethodInfo z klasy bazowej do wywołania przesłoniętej metody w klasie pochodnej, ponieważ późne wiązanie nie może rozwiązać zastąpień.Note that you cannot use the MethodInfo object from the base class to invoke the overridden method in the derived class, because late binding cannot resolve overrides.

using namespace System;
using namespace System::Reflection;

public ref class MagicClass
{
private:
    int magicBaseValue;

public:
    MagicClass()
    {
        magicBaseValue = 9;
    }

    int ItsMagic(int preMagic)
    {
        return preMagic * magicBaseValue;
    }
};

public ref class TestMethodInfo
{
public:
    static void Main()
    {
        // Get the constructor and create an instance of MagicClass

        Type^ magicType = Type::GetType("MagicClass");
        ConstructorInfo^ magicConstructor = magicType->GetConstructor(Type::EmptyTypes);
        Object^ magicClassObject = magicConstructor->Invoke(gcnew array<Object^>(0));

        // Get the ItsMagic method and invoke with a parameter value of 100

        MethodInfo^ magicMethod = magicType->GetMethod("ItsMagic");
        Object^ magicValue = magicMethod->Invoke(magicClassObject, gcnew array<Object^>(1){100});

        Console::WriteLine("MethodInfo.Invoke() Example\n");
        Console::WriteLine("MagicClass.ItsMagic() returned: {0}", magicValue);
    }
};

int main()
{
    TestMethodInfo::Main();
}

// The example program gives the following output:
//
// MethodInfo.Invoke() Example
//
// MagicClass.ItsMagic() returned: 900
using System;
using System.Reflection;

public class MagicClass
{
    private int magicBaseValue;

    public MagicClass()
    {
        magicBaseValue = 9;
    }
    
    public int ItsMagic(int preMagic)
    {
        return preMagic * magicBaseValue;
    }
}

public class TestMethodInfo
{
    public static void Main()
    {
        // Get the constructor and create an instance of MagicClass

        Type magicType = Type.GetType("MagicClass");
        ConstructorInfo magicConstructor = magicType.GetConstructor(Type.EmptyTypes);
        object magicClassObject = magicConstructor.Invoke(new object[]{});

        // Get the ItsMagic method and invoke with a parameter value of 100

        MethodInfo magicMethod = magicType.GetMethod("ItsMagic");
        object magicValue = magicMethod.Invoke(magicClassObject, new object[]{100});

        Console.WriteLine("MethodInfo.Invoke() Example\n");
        Console.WriteLine("MagicClass.ItsMagic() returned: {0}", magicValue);
    }
}

// The example program gives the following output:
//
// MethodInfo.Invoke() Example
//
// MagicClass.ItsMagic() returned: 900
Imports System.Reflection

Public Class MagicClass
    Private magicBaseValue As Integer

    Public Sub New()
        magicBaseValue = 9
    End Sub

    Public Function ItsMagic(preMagic As Integer) As Integer
        Return preMagic * magicBaseValue
    End Function
End Class

Public Class TestMethodInfo
    Public Shared Sub Main()
        ' Get the constructor and create an instance of MagicClass

        Dim magicType As Type = Type.GetType("MagicClass")
        Dim magicConstructor As ConstructorInfo = magicType.GetConstructor(Type.EmptyTypes)
        Dim magicClassObject As Object = magicConstructor.Invoke(New Object(){})

        ' Get the ItsMagic method and invoke with a parameter value of 100

        Dim magicMethod As MethodInfo = magicType.GetMethod("ItsMagic")
        Dim magicValue As Object = magicMethod.Invoke(magicClassObject, New Object(){100})

        Console.WriteLine("MethodInfo.Invoke() Example" + vbNewLine)
        Console.WriteLine("MagicClass.ItsMagic() returned: {0}", magicValue)
    End Sub
End Class

' The example program gives the following output:
'
' MethodInfo.Invoke() Example
'
' MagicClass.ItsMagic() returned: 900

Uwagi

Jest to wygodna metoda, która wywołuje Przeciążenie metody Invoke(Object, BindingFlags, Binder, Object[], CultureInfo), przekazując Default do invokeAttr i null dla binder i culture.This is a convenience method that calls the Invoke(Object, BindingFlags, Binder, Object[], CultureInfo) method overload, passing Default for invokeAttr and null for binder and culture.

Jeśli wywołana metoda zgłasza wyjątek, Metoda Exception.GetBaseException zwraca wyjątek.If the invoked method throws an exception, the Exception.GetBaseException method returns the exception.

Aby wywołać metodę statyczną przy użyciu obiektu MethodInfo, należy przekazać null do obj.To invoke a static method using its MethodInfo object, pass null for obj.

Uwaga

Jeśli to Przeciążenie metody jest używane do wywołania konstruktora wystąpienia, obiekt dostarczony dla obj jest zainicjowany ponownie; oznacza to, że wszystkie inicjatory wystąpień są wykonywane.If this method overload is used to invoke an instance constructor, the object supplied for obj is reinitialized; that is, all instance initializers are executed. Wartość zwracana jest null.The return value is null. Jeśli Konstruktor klasy jest wywoływany, Klasa zostanie zainicjowana ponownie; oznacza to, że wszystkie inicjatory klas są wykonywane.If a class constructor is invoked, the class is reinitialized; that is, all class initializers are executed. Wartość zwracana jest null.The return value is null.

Uwaga

Począwszy od .NET Framework 2.0 z dodatkiem Service Pack 1.NET Framework 2.0 Service Pack 1, ta metoda może być używana w celu uzyskania dostępu do niepublicznych składowych, jeśli obiekt wywołujący został przyznany ReflectionPermission z flagą ReflectionPermissionFlag.RestrictedMemberAccess i jeśli zestaw uprawnień niepublicznych składowych jest ograniczony do zestawu uprawnień obiektu wywołującego lub jego podzbioru.Starting with the .NET Framework 2.0 z dodatkiem Service Pack 1.NET Framework 2.0 Service Pack 1, this method can be used to access non-public members if the caller has been granted ReflectionPermission with the ReflectionPermissionFlag.RestrictedMemberAccess flag and if the grant set of the non-public members is restricted to the caller's grant set, or a subset thereof. (Zobacz zagadnienia dotyczące zabezpieczeń w przypadku odbicia).(See Security Considerations for Reflection.)

Aby użyć tej funkcji, aplikacja powinna kierować do Program .NET Framework 3,5.NET Framework 3.5 lub później.To use this functionality, your application should target the Program .NET Framework 3,5.NET Framework 3.5 or later.

Jeśli parametr bieżącej metody jest typem wartości, a odpowiadający mu argument w parameters jest null, środowisko uruchomieniowe przekazuje wystąpienie typu wartości, które jest inicjowane zero.If a parameter of the current method is a value type, and the corresponding argument in parameters is null, the runtime passes a zero-initialized instance of the value type.

Zobacz też

Invoke(Object, BindingFlags, Binder, Object[], CultureInfo)

Gdy jest zastępowany w klasie pochodnej, wywołuje odbitej metody lub konstruktora z podanym parametrem.When overridden in a derived class, invokes the reflected method or constructor with the given parameters.

public:
 abstract System::Object ^ Invoke(System::Object ^ obj, System::Reflection::BindingFlags invokeAttr, System::Reflection::Binder ^ binder, cli::array <System::Object ^> ^ parameters, System::Globalization::CultureInfo ^ culture);
public abstract object Invoke (object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object[] parameters, System.Globalization.CultureInfo culture);
abstract member Invoke : obj * System.Reflection.BindingFlags * System.Reflection.Binder * obj[] * System.Globalization.CultureInfo -> obj

Parametry

obj
Object

Obiekt, dla którego ma zostać wywołana metoda lub Konstruktor.The object on which to invoke the method or constructor. Jeśli metoda jest statyczna, ten argument jest ignorowany.If a method is static, this argument is ignored. Jeśli Konstruktor jest statyczny, ten argument musi być null lub wystąpienie klasy, która definiuje konstruktora.If a constructor is static, this argument must be null or an instance of the class that defines the constructor.

invokeAttr
BindingFlags

Maska bitów, która jest kombinacją 0 lub więcej flag bitowych z BindingFlags.A bitmask that is a combination of 0 or more bit flags from BindingFlags. Jeśli binder jest null, ten parametr ma przypisaną wartość Default; z tego względu, każdy przekazany jest ignorowany.If binder is null, this parameter is assigned the value Default; thus, whatever you pass in is ignored.

binder
Binder

Obiekt, który umożliwia powiązanie, wymuszanie typów argumentów, wywoływanie elementów członkowskich oraz pobieranie MemberInfo obiektów poprzez odbicie.An object that enables the binding, coercion of argument types, invocation of members, and retrieval of MemberInfo objects via reflection. Jeśli binder jest null, zostanie użyty domyślny spinacz.If binder is null, the default binder is used.

parameters
Object[]

Lista argumentów dla wywołanej metody lub konstruktora.An argument list for the invoked method or constructor. Jest to tablica obiektów o tej samej liczbie, kolejności i typie co parametry metody lub konstruktora, które mają być wywoływane.This is an array of objects with the same number, order, and type as the parameters of the method or constructor to be invoked. Jeśli nie ma żadnych parametrów, powinna to być null.If there are no parameters, this should be null.

Jeśli metoda lub Konstruktor reprezentowane przez to wystąpienie przyjmuje parametr ByRef, nie istnieje specjalny atrybut wymagany dla tego parametru, aby wywołać metodę lub Konstruktor przy użyciu tej funkcji.If the method or constructor represented by this instance takes a ByRef parameter, there is no special attribute required for that parameter in order to invoke the method or constructor using this function. Każdy obiekt w tej tablicy, który nie jest jawnie zainicjowany przy użyciu wartości, będzie zawierać wartość domyślną dla tego typu obiektu.Any object in this array that is not explicitly initialized with a value will contain the default value for that object type. Dla elementów typu odwołania ta wartość jest null.For reference-type elements, this value is null. Dla elementów typu wartości ta wartość jest równa 0, 0,0 lub false, w zależności od typu określonego elementu.For value-type elements, this value is 0, 0.0, or false, depending on the specific element type.

culture
CultureInfo

Wystąpienie CultureInfo używane do zarządzania przymusem typów.An instance of CultureInfo used to govern the coercion of types. W przypadku nulljest używany CultureInfo dla bieżącego wątku.If this is null, the CultureInfo for the current thread is used. (Jest to konieczne do przekonwertowania String, która reprezentuje 1000 do wartości Double, na przykład, ponieważ 1000 jest reprezentowana inaczej w różnych kulturach).(This is necessary to convert a String that represents 1000 to a Double value, for example, since 1000 is represented differently by different cultures.)

Zwraca

Object zawierający wartość zwracaną wywołanej metody lub null w przypadku konstruktora lub null, jeśli typ zwracany metody jest void.An Object containing the return value of the invoked method, or null in the case of a constructor, or null if the method's return type is void. Przed wywołaniem metody lub konstruktora Invoke sprawdza, czy użytkownik ma uprawnienia dostępu i sprawdza, czy parametry są prawidłowe.Before calling the method or constructor, Invoke checks to see if the user has access permission and verifies that the parameters are valid.

Implementuje

Wyjątki

Parametr obj jest null i metoda nie jest statyczna.The obj parameter is null and the method is not static.

— lub —-or- Metoda nie jest zadeklarowana ani dziedziczona przez klasę obj.The method is not declared or inherited by the class of obj.

— lub —-or- Wywoływany jest Konstruktor statyczny, a obj nie jest ani null ani wystąpieniem klasy, która deklaruje Konstruktor.A static constructor is invoked, and obj is neither null nor an instance of the class that declared the constructor.

Typ parametru parameters nie pasuje do sygnatury metody lub konstruktora odzwierciedlonej przez to wystąpienie.The type of the parameters parameter does not match the signature of the method or constructor reflected by this instance.

Tablica parameters nie ma poprawnej liczby argumentów.The parameters array does not have the correct number of arguments.

Wywołana metoda lub Konstruktor zgłasza wyjątek.The invoked method or constructor throws an exception.

Obiekt wywołujący nie ma uprawnień do wykonania metody lub konstruktora reprezentowanego przez bieżące wystąpienie.The caller does not have permission to execute the method or constructor that is represented by the current instance.

Typ, który deklaruje metodę, jest otwartym typem ogólnym.The type that declares the method is an open generic type. Oznacza to, że właściwość ContainsGenericParameters zwraca true dla typu deklarującego.That is, the ContainsGenericParameters property returns true for the declaring type.

Przykłady

Poniższy przykład demonstruje wszystkie elementy członkowskie klasy System.Reflection.Binder przy użyciu przeciążenia Type.InvokeMember.The following example demonstrates all members of the System.Reflection.Binder class using an overload of Type.InvokeMember. Metoda prywatna CanConvertFrom znajduje zgodne typy dla danego typu.The private method CanConvertFrom finds compatible types for a given type. Aby uzyskać inny przykład wywoływania elementów członkowskich w scenariuszu powiązania niestandardowego, zobacz dynamiczne ładowanie i używanie typów.For another example of invoking members in a custom binding scenario, see Dynamically Loading and Using Types.

using namespace System;
using namespace System::Reflection;
using namespace System::Globalization;
using namespace System::Runtime::InteropServices;
public ref class MyBinder: public Binder
{
public:
   MyBinder()
      : Binder()
   {}

private:
   ref class BinderState
   {
   public:
      array<Object^>^args;
   };

public:
   virtual FieldInfo^ BindToField( BindingFlags bindingAttr, array<FieldInfo^>^match, Object^ value, CultureInfo^ culture ) override
   {
      if ( match == nullptr )
            throw gcnew ArgumentNullException( "match" );

      // Get a field for which the value parameter can be converted to the specified field type.
      for ( int i = 0; i < match->Length; i++ )
         if ( ChangeType( value, match[ i ]->FieldType, culture ) != nullptr )
                  return match[ i ];

      return nullptr;
   }

   virtual MethodBase^ BindToMethod( BindingFlags bindingAttr, array<MethodBase^>^match, array<Object^>^%args, array<ParameterModifier>^ modifiers, CultureInfo^ culture, array<String^>^names, [Out]Object^% state ) override
   {
      // Store the arguments to the method in a state Object*.
      BinderState^ myBinderState = gcnew BinderState;
      array<Object^>^arguments = gcnew array<Object^>(args->Length);
      args->CopyTo( arguments, 0 );
      myBinderState->args = arguments;
      state = myBinderState;
      if ( match == nullptr )
            throw gcnew ArgumentNullException;

      // Find a method that has the same parameters as those of the args parameter.
      for ( int i = 0; i < match->Length; i++ )
      {
         // Count the number of parameters that match.
         int count = 0;
         array<ParameterInfo^>^parameters = match[ i ]->GetParameters();

         // Go on to the next method if the number of parameters do not match.
         if ( args->Length != parameters->Length )
                  continue;

         // Match each of the parameters that the user expects the method to have.
         for ( int j = 0; j < args->Length; j++ )
         {
            // If the names parameter is not 0, then reorder args.
            if ( names != nullptr )
            {
               if ( names->Length != args->Length )
                              throw gcnew ArgumentException( "names and args must have the same number of elements." );

               for ( int k = 0; k < names->Length; k++ )
                  if ( String::Compare( parameters[ j ]->Name, names[ k ] ) == 0 )
                                    args[ j ] = myBinderState->args[ k ];
            }

            // Determine whether the types specified by the user can be converted to the parameter type.
            if ( ChangeType( args[ j ], parameters[ j ]->ParameterType, culture ) != nullptr )
                        count += 1;
            else
                        break;
         }
         if ( count == args->Length )
                  return match[ i ];
      }
      return nullptr;
   }

   virtual Object^ ChangeType( Object^ value, Type^ myChangeType, CultureInfo^ culture ) override
   {
      // Determine whether the value parameter can be converted to a value of type myType.
      if ( CanConvertFrom( value->GetType(), myChangeType ) )
         // Return the converted Object*.
         return Convert::ChangeType( value, myChangeType ); 
      else
         return nullptr;
   }

   virtual void ReorderArgumentArray( array<Object^>^%args, Object^ state ) override
   {
      // Return the args that had been reordered by BindToMethod.
      (safe_cast<BinderState^>(state))->args->CopyTo( args, 0 );
   }

   virtual MethodBase^ SelectMethod( BindingFlags bindingAttr, array<MethodBase^>^match, array<Type^>^types, array<ParameterModifier>^ modifiers ) override
   {
      if ( match == nullptr )
            throw gcnew ArgumentNullException( "match" );

      for ( int i = 0; i < match->Length; i++ )
      {
         // Count the number of parameters that match.
         int count = 0;
         array<ParameterInfo^>^parameters = match[ i ]->GetParameters();

         // Go on to the next method if the number of parameters do not match.
         if ( types->Length != parameters->Length )
                  continue;

         // Match each of the parameters that the user expects the method to have.
         for ( int j = 0; j < types->Length; j++ )
         {
            // Determine whether the types specified by the user can be converted to parameter type.
            if ( CanConvertFrom( types[ j ], parameters[ j ]->ParameterType ) )
                        count += 1;
            else
                        break;
         }
         // Determine whether the method has been found.
         if ( count == types->Length )
                  return match[ i ];
      }
      return nullptr;
   }

   virtual PropertyInfo^ SelectProperty( BindingFlags bindingAttr, array<PropertyInfo^>^match, Type^ returnType, array<Type^>^indexes, array<ParameterModifier>^ modifiers ) override
   {
      if ( match == nullptr )
            throw gcnew ArgumentNullException( "match" );

      for ( int i = 0; i < match->Length; i++ )
      {
         // Count the number of indexes that match.
         int count = 0;
         array<ParameterInfo^>^parameters = match[ i ]->GetIndexParameters();

         // Go on to the next property if the number of indexes do not match.
         if ( indexes->Length != parameters->Length )
                  continue;

         // Match each of the indexes that the user expects the property to have.
         for ( int j = 0; j < indexes->Length; j++ )
            // Determine whether the types specified by the user can be converted to index type.
            if ( CanConvertFrom( indexes[ j ], parameters[ j ]->ParameterType ) )
                        count += 1;
            else
                        break;

         // Determine whether the property has been found.
         if ( count == indexes->Length )
         {
            // Determine whether the return type can be converted to the properties type.
            if ( CanConvertFrom( returnType, match[ i ]->PropertyType ) )
                  return match[ i ];
            else
                  continue;
         }
      }
      return nullptr;
   }

private:

   // Determines whether type1 can be converted to type2. Check only for primitive types.
   bool CanConvertFrom( Type^ type1, Type^ type2 )
   {
      if ( type1->IsPrimitive && type2->IsPrimitive )
      {
         TypeCode typeCode1 = Type::GetTypeCode( type1 );
         TypeCode typeCode2 = Type::GetTypeCode( type2 );

         // If both type1 and type2 have the same type, return true.
         if ( typeCode1 == typeCode2 )
                  return true;

         // Possible conversions from Char follow.
         if ( typeCode1 == TypeCode::Char )
         {
            switch ( typeCode2 )
            {
               case TypeCode::UInt16:
                  return true;

               case TypeCode::UInt32:
                  return true;

               case TypeCode::Int32:
                  return true;

               case TypeCode::UInt64:
                  return true;

               case TypeCode::Int64:
                  return true;

               case TypeCode::Single:
                  return true;

               case TypeCode::Double:
                  return true;

               default:
                  return false;
            }
         }

         // Possible conversions from Byte follow.
         if ( typeCode1 == TypeCode::Byte )
         {
            switch ( typeCode2 )
            {
               case TypeCode::Char:
                  return true;

               case TypeCode::UInt16:
                  return true;

               case TypeCode::Int16:
                  return true;

               case TypeCode::UInt32:
                  return true;

               case TypeCode::Int32:
                  return true;

               case TypeCode::UInt64:
                  return true;

               case TypeCode::Int64:
                  return true;

               case TypeCode::Single:
                  return true;

               case TypeCode::Double:
                  return true;

               default:
                  return false;
            }
         }

         // Possible conversions from SByte follow.
         if ( typeCode1 == TypeCode::SByte )
         {
            switch ( typeCode2 )
            {
               case TypeCode::Int16:
                  return true;

               case TypeCode::Int32:
                  return true;

               case TypeCode::Int64:
                  return true;

               case TypeCode::Single:
                  return true;

               case TypeCode::Double:
                  return true;

               default:
                  return false;
            }
         }

         // Possible conversions from UInt16 follow.
         if ( typeCode1 == TypeCode::UInt16 )
         {
            switch ( typeCode2 )
            {
               case TypeCode::UInt32:
                  return true;

               case TypeCode::Int32:
                  return true;

               case TypeCode::UInt64:
                  return true;

               case TypeCode::Int64:
                  return true;

               case TypeCode::Single:
                  return true;

               case TypeCode::Double:
                  return true;

               default:
                  return false;
            }
         }

         // Possible conversions from Int16 follow.
         if ( typeCode1 == TypeCode::Int16 )
         {
            switch ( typeCode2 )
            {
               case TypeCode::Int32:
                  return true;

               case TypeCode::Int64:
                  return true;

               case TypeCode::Single:
                  return true;

               case TypeCode::Double:
                  return true;

               default:
                  return false;
            }
         }

         // Possible conversions from UInt32 follow.
         if ( typeCode1 == TypeCode::UInt32 )
         {
            switch ( typeCode2 )
            {
               case TypeCode::UInt64:
                  return true;

               case TypeCode::Int64:
                  return true;

               case TypeCode::Single:
                  return true;

               case TypeCode::Double:
                  return true;

               default:
                  return false;
            }
         }

         // Possible conversions from Int32 follow.
         if ( typeCode1 == TypeCode::Int32 )
         {
            switch ( typeCode2 )
            {
               case TypeCode::Int64:
                  return true;

               case TypeCode::Single:
                  return true;

               case TypeCode::Double:
                  return true;

               default:
                  return false;
            }
         }

         // Possible conversions from UInt64 follow.
         if ( typeCode1 == TypeCode::UInt64 )
         {
            switch ( typeCode2 )
            {
               case TypeCode::Single:
                  return true;

               case TypeCode::Double:
                  return true;

               default:
                  return false;
            }
         }

         // Possible conversions from Int64 follow.
         if ( typeCode1 == TypeCode::Int64 )
         {
            switch ( typeCode2 )
            {
               case TypeCode::Single:
                  return true;

               case TypeCode::Double:
                  return true;

               default:
                  return false;
            }
         }

         // Possible conversions from Single follow.
         if ( typeCode1 == TypeCode::Single )
         {
            switch ( typeCode2 )
            {
               case TypeCode::Double:
                  return true;

               default:
                  return false;
            }
         }
      }

      return false;
   }

};

public ref class MyClass1
{
public:
   short myFieldB;
   int myFieldA;
   void MyMethod( long i, char k )
   {
      Console::WriteLine( "\nThis is MyMethod(long i, char k)" );
   }

   void MyMethod( long i, long j )
   {
      Console::WriteLine( "\nThis is MyMethod(long i, long j)" );
   }
};

int main()
{
   // Get the type of MyClass1.
   Type^ myType = MyClass1::typeid;

   // Get the instance of MyClass1.
   MyClass1^ myInstance = gcnew MyClass1;
   Console::WriteLine( "\nDisplaying the results of using the MyBinder binder.\n" );

   // Get the method information for MyMethod.
   array<Type^>^types = {short::typeid,short::typeid};
   MethodInfo^ myMethod = myType->GetMethod( "MyMethod", static_cast<BindingFlags>(BindingFlags::Public | BindingFlags::Instance), gcnew MyBinder, types, nullptr );
   Console::WriteLine( myMethod );

   // Invoke MyMethod.
   array<Object^>^obj = {32,32};
   myMethod->Invoke( myInstance, BindingFlags::InvokeMethod, gcnew MyBinder, obj, CultureInfo::CurrentCulture );
}
using System;
using System.Reflection;
using System.Globalization;

public class MyBinder : Binder 
{
    public MyBinder() : base()
    {
    }
    private class BinderState
    {
        public object[] args;
    }
    public override FieldInfo BindToField(
        BindingFlags bindingAttr,
        FieldInfo[] match,
        object value,
        CultureInfo culture
        )
    {
        if(match == null)
            throw new ArgumentNullException("match");
        // Get a field for which the value parameter can be converted to the specified field type.
        for(int i = 0; i < match.Length; i++)
            if(ChangeType(value, match[i].FieldType, culture) != null)
                return match[i];
        return null;
    }
    public override MethodBase BindToMethod(
        BindingFlags bindingAttr,
        MethodBase[] match,
        ref object[] args,
        ParameterModifier[] modifiers,
        CultureInfo culture,
        string[] names,
        out object state
        )
    {
        // Store the arguments to the method in a state object.
        BinderState myBinderState = new BinderState();
        object[] arguments = new Object[args.Length];
        args.CopyTo(arguments, 0);
        myBinderState.args = arguments;
        state = myBinderState;
        if(match == null)
            throw new ArgumentNullException();
        // Find a method that has the same parameters as those of the args parameter.
        for(int i = 0; i < match.Length; i++)
        {
            // Count the number of parameters that match.
            int count = 0;
            ParameterInfo[] parameters = match[i].GetParameters();
            // Go on to the next method if the number of parameters do not match.
            if(args.Length != parameters.Length)
                continue;
            // Match each of the parameters that the user expects the method to have.
            for(int j = 0; j < args.Length; j++)
            {
                // If the names parameter is not null, then reorder args.
                if(names != null)
                {
                    if(names.Length != args.Length)
                        throw new ArgumentException("names and args must have the same number of elements.");
                    for(int k = 0; k < names.Length; k++)
                        if(String.Compare(parameters[j].Name, names[k].ToString()) == 0)
                            args[j] = myBinderState.args[k];
                }
                // Determine whether the types specified by the user can be converted to the parameter type.
                if(ChangeType(args[j], parameters[j].ParameterType, culture) != null)
                    count += 1;
                else
                    break;
            }
            // Determine whether the method has been found.
            if(count == args.Length)
                return match[i];
        }
        return null;
    }
    public override object ChangeType(
        object value,
        Type myChangeType,
        CultureInfo culture
        )
    {
        // Determine whether the value parameter can be converted to a value of type myType.
        if(CanConvertFrom(value.GetType(), myChangeType))
            // Return the converted object.
            return Convert.ChangeType(value, myChangeType);
        else
            // Return null.
            return null;
    }
    public override void ReorderArgumentArray(
        ref object[] args,
        object state
        )
    {
        // Return the args that had been reordered by BindToMethod.
        ((BinderState)state).args.CopyTo(args, 0);
    }
    public override MethodBase SelectMethod(
        BindingFlags bindingAttr,
        MethodBase[] match,
        Type[] types,
        ParameterModifier[] modifiers
        )
    {
        if(match == null)
            throw new ArgumentNullException("match");
        for(int i = 0; i < match.Length; i++)
        {
            // Count the number of parameters that match.
            int count = 0; 
            ParameterInfo[] parameters = match[i].GetParameters();
            // Go on to the next method if the number of parameters do not match.
            if(types.Length != parameters.Length)
                continue;
            // Match each of the parameters that the user expects the method to have.
            for(int j = 0; j < types.Length; j++)
                // Determine whether the types specified by the user can be converted to parameter type.
                if(CanConvertFrom(types[j], parameters[j].ParameterType))
                    count += 1;
                else
                    break;
            // Determine whether the method has been found.
            if(count == types.Length)
                return match[i];
        }
        return null;
    }
    public override PropertyInfo SelectProperty(
        BindingFlags bindingAttr,
        PropertyInfo[] match,
        Type returnType,
        Type[] indexes,
        ParameterModifier[] modifiers
        )
    {
        if(match == null)
            throw new ArgumentNullException("match");
        for(int i = 0; i < match.Length; i++)
        {
            // Count the number of indexes that match.
            int count = 0;
            ParameterInfo[] parameters = match[i].GetIndexParameters();
            // Go on to the next property if the number of indexes do not match.
            if(indexes.Length != parameters.Length)
                continue;
            // Match each of the indexes that the user expects the property to have.
            for(int j = 0; j < indexes.Length; j++)
                // Determine whether the types specified by the user can be converted to index type.
                if(CanConvertFrom(indexes[j], parameters[j].ParameterType))
                    count += 1;
                else
                    break;
            // Determine whether the property has been found.
            if(count == indexes.Length)
                // Determine whether the return type can be converted to the properties type.
                if(CanConvertFrom(returnType, match[i].PropertyType))
                    return match[i];
                else
                    continue;
        }
        return null;
    }
    // Determines whether type1 can be converted to type2. Check only for primitive types.
    private bool CanConvertFrom(Type type1, Type type2)
    {
        if(type1.IsPrimitive && type2.IsPrimitive)
        {
            TypeCode typeCode1 = Type.GetTypeCode(type1);
            TypeCode typeCode2 = Type.GetTypeCode(type2);
            // If both type1 and type2 have the same type, return true.
            if(typeCode1 == typeCode2)
                return true;
            // Possible conversions from Char follow.
            if(typeCode1 == TypeCode.Char)
                switch(typeCode2)
                {
                    case TypeCode.UInt16 : return true;
                    case TypeCode.UInt32 : return true;
                    case TypeCode.Int32  : return true;
                    case TypeCode.UInt64 : return true;
                    case TypeCode.Int64  : return true;
                    case TypeCode.Single : return true;
                    case TypeCode.Double : return true;
                    default              : return false;
                }
            // Possible conversions from Byte follow.
            if(typeCode1 == TypeCode.Byte)
                switch(typeCode2)
                {
                    case TypeCode.Char   : return true;
                    case TypeCode.UInt16 : return true;
                    case TypeCode.Int16  : return true;
                    case TypeCode.UInt32 : return true;
                    case TypeCode.Int32  : return true;
                    case TypeCode.UInt64 : return true;
                    case TypeCode.Int64  : return true;
                    case TypeCode.Single : return true;
                    case TypeCode.Double : return true;
                    default              : return false;
                }
            // Possible conversions from SByte follow.
            if(typeCode1 == TypeCode.SByte)
                switch(typeCode2)
                {
                    case TypeCode.Int16  : return true;
                    case TypeCode.Int32  : return true;
                    case TypeCode.Int64  : return true;
                    case TypeCode.Single : return true;
                    case TypeCode.Double : return true;
                    default              : return false;
                }
            // Possible conversions from UInt16 follow.
            if(typeCode1 == TypeCode.UInt16)
                switch(typeCode2)
                {
                    case TypeCode.UInt32 : return true;
                    case TypeCode.Int32  : return true;
                    case TypeCode.UInt64 : return true;
                    case TypeCode.Int64  : return true;
                    case TypeCode.Single : return true;
                    case TypeCode.Double : return true;
                    default              : return false;
                }
            // Possible conversions from Int16 follow.
            if(typeCode1 == TypeCode.Int16)
                switch(typeCode2)
                {
                    case TypeCode.Int32  : return true;
                    case TypeCode.Int64  : return true;
                    case TypeCode.Single : return true;
                    case TypeCode.Double : return true;
                    default              : return false;
                }
            // Possible conversions from UInt32 follow.
            if(typeCode1 == TypeCode.UInt32)
                switch(typeCode2)
                {
                    case TypeCode.UInt64 : return true;
                    case TypeCode.Int64  : return true;
                    case TypeCode.Single : return true;
                    case TypeCode.Double : return true;
                    default              : return false;
                }
            // Possible conversions from Int32 follow.
            if(typeCode1 == TypeCode.Int32)
                switch(typeCode2)
                {
                    case TypeCode.Int64  : return true;
                    case TypeCode.Single : return true;
                    case TypeCode.Double : return true;
                    default              : return false;
                }
            // Possible conversions from UInt64 follow.
            if(typeCode1 == TypeCode.UInt64)
                switch(typeCode2)
                {
                    case TypeCode.Single : return true;
                    case TypeCode.Double : return true;
                    default              : return false;
                }
            // Possible conversions from Int64 follow.
            if(typeCode1 == TypeCode.Int64)
                switch(typeCode2)
                {
                    case TypeCode.Single : return true;
                    case TypeCode.Double : return true;
                    default              : return false;
                }
            // Possible conversions from Single follow.
            if(typeCode1 == TypeCode.Single)
                switch(typeCode2)
                {
                    case TypeCode.Double : return true;
                    default              : return false;
                }
        }
        return false;
    }
}
public class MyClass1
{
    public short myFieldB;
    public int myFieldA; 
    public void MyMethod(long i, char k)
    {
        Console.WriteLine("\nThis is MyMethod(long i, char k)");
    }
    public void MyMethod(long i, long j)
    {
        Console.WriteLine("\nThis is MyMethod(long i, long j)");
    }
}
public class Binder_Example
{
    public static void Main()
    {
        // Get the type of MyClass1.
        Type myType = typeof(MyClass1);
        // Get the instance of MyClass1.
        MyClass1 myInstance = new MyClass1();
        Console.WriteLine("\nDisplaying the results of using the MyBinder binder.\n");
        // Get the method information for MyMethod.
        MethodInfo myMethod = myType.GetMethod("MyMethod", BindingFlags.Public | BindingFlags.Instance,
            new MyBinder(), new Type[] {typeof(short), typeof(short)}, null);
        Console.WriteLine(myMethod);
        // Invoke MyMethod.
        myMethod.Invoke(myInstance, BindingFlags.InvokeMethod, new MyBinder(), new Object[] {(int)32, (int)32}, CultureInfo.CurrentCulture);
    }
}
Imports System.Reflection
Imports System.Globalization

Public Class MyBinder
    Inherits Binder
    Public Sub New()
        MyBase.new()
    End Sub
    Private Class BinderState
        Public args() As Object
    End Class

    Public Overrides Function BindToField(ByVal bindingAttr As BindingFlags, ByVal match() As FieldInfo, ByVal value As Object, ByVal culture As CultureInfo) As FieldInfo
        If match Is Nothing Then
            Throw New ArgumentNullException("match")
        End If
        ' Get a field for which the value parameter can be converted to the specified field type.
        Dim i As Integer
        For i = 0 To match.Length - 1
            If Not (ChangeType(value, match(i).FieldType, culture) Is Nothing) Then
                Return match(i)
            End If
        Next i
        Return Nothing
    End Function 'BindToField

    Public Overrides Function BindToMethod(ByVal bindingAttr As BindingFlags, ByVal match() As MethodBase, ByRef args() As Object, ByVal modifiers() As ParameterModifier, ByVal culture As CultureInfo, ByVal names() As String, ByRef state As Object) As MethodBase
        ' Store the arguments to the method in a state object.
        Dim myBinderState As New BinderState()
        Dim arguments() As Object = New [Object](args.Length) {}
        args.CopyTo(arguments, 0)
        myBinderState.args = arguments
        state = myBinderState

        If match Is Nothing Then
            Throw New ArgumentNullException()
        End If
        ' Find a method that has the same parameters as those of args.
        Dim i As Integer
        For i = 0 To match.Length - 1
            ' Count the number of parameters that match.
            Dim count As Integer = 0
            Dim parameters As ParameterInfo() = match(i).GetParameters()
            ' Go on to the next method if the number of parameters do not match.
            If args.Length <> parameters.Length Then
                GoTo ContinueFori
            End If
            ' Match each of the parameters that the user expects the method to have.
            Dim j As Integer
            For j = 0 To args.Length - 1
                ' If names is not null, then reorder args.
                If Not (names Is Nothing) Then
                    If names.Length <> args.Length Then
                        Throw New ArgumentException("names and args must have the same number of elements.")
                    End If
                    Dim k As Integer
                    For k = 0 To names.Length - 1
                        If String.Compare(parameters(j).Name, names(k).ToString()) = 0 Then
                            args(j) = myBinderState.args(k)
                        End If
                    Next k
                End If ' Determine whether the types specified by the user can be converted to parameter type.
                If Not (ChangeType(args(j), parameters(j).ParameterType, culture) Is Nothing) Then
                    count += 1
                Else
                    Exit For
                End If
            Next j
            ' Determine whether the method has been found.
            If count = args.Length Then
                Return match(i)
            End If
ContinueFori:
        Next i
        Return Nothing
    End Function 'BindToMethod

    Public Overrides Function ChangeType(ByVal value As Object, ByVal myChangeType As Type, ByVal culture As CultureInfo) As Object
        ' Determine whether the value parameter can be converted to a value of type myType.
        If CanConvertFrom(value.GetType(), myChangeType) Then
            ' Return the converted object.
            Return Convert.ChangeType(value, myChangeType)
            ' Return null.
        Else
            Return Nothing
        End If
    End Function 'ChangeType

    Public Overrides Sub ReorderArgumentArray(ByRef args() As Object, ByVal state As Object)
        'Redimension the array to hold the state values.
        ReDim args(CType(state, BinderState).args.Length)
        ' Return the args that had been reordered by BindToMethod.
        CType(state, BinderState).args.CopyTo(args, 0)
    End Sub

    Public Overrides Function SelectMethod(ByVal bindingAttr As BindingFlags, ByVal match() As MethodBase, ByVal types() As Type, ByVal modifiers() As ParameterModifier) As MethodBase
        If match Is Nothing Then
            Throw New ArgumentNullException("match")
        End If
        Dim i As Integer
        For i = 0 To match.Length - 1
            ' Count the number of parameters that match.
            Dim count As Integer = 0
            Dim parameters As ParameterInfo() = match(i).GetParameters()
            ' Go on to the next method if the number of parameters do not match.
            If types.Length <> parameters.Length Then
                GoTo ContinueFori
            End If
            ' Match each of the parameters that the user expects the method to have.
            Dim j As Integer
            For j = 0 To types.Length - 1
                ' Determine whether the types specified by the user can be converted to parameter type.
                If CanConvertFrom(types(j), parameters(j).ParameterType) Then
                    count += 1
                Else
                    Exit For
                End If
            Next j ' Determine whether the method has been found.
            If count = types.Length Then
                Return match(i)
            End If
ContinueFori:
        Next i
        Return Nothing
    End Function 'SelectMethod
    Public Overrides Function SelectProperty(ByVal bindingAttr As BindingFlags, ByVal match() As PropertyInfo, ByVal returnType As Type, ByVal indexes() As Type, ByVal modifiers() As ParameterModifier) As PropertyInfo
        If match Is Nothing Then
            Throw New ArgumentNullException("match")
        End If
        Dim i As Integer
        For i = 0 To match.Length - 1
            ' Count the number of indexes that match.
            Dim count As Integer = 0
            Dim parameters As ParameterInfo() = match(i).GetIndexParameters()

            ' Go on to the next property if the number of indexes do not match.
            If indexes.Length <> parameters.Length Then
                GoTo ContinueFori
            End If
            ' Match each of the indexes that the user expects the property to have.
            Dim j As Integer
            For j = 0 To indexes.Length - 1
                ' Determine whether the types specified by the user can be converted to index type.
                If CanConvertFrom(indexes(j), parameters(j).ParameterType) Then
                    count += 1
                Else
                    Exit For
                End If
            Next j ' Determine whether the property has been found.
            If count = indexes.Length Then
                ' Determine whether the return type can be converted to the properties type.
                If CanConvertFrom(returnType, match(i).PropertyType) Then
                    Return match(i)
                Else
                    GoTo ContinueFori
                End If
            End If
ContinueFori:
        Next i
        Return Nothing
    End Function 'SelectProperty

    ' Determine whether type1 can be converted to type2. Check only for primitive types.
    Private Function CanConvertFrom(ByVal type1 As Type, ByVal type2 As Type) As Boolean
        If type1.IsPrimitive And type2.IsPrimitive Then
            Dim typeCode1 As TypeCode = Type.GetTypeCode(type1)
            Dim typeCode2 As TypeCode = Type.GetTypeCode(type2)
            ' If both type1 and type2 have same type, return true.
            If typeCode1 = typeCode2 Then
                Return True
            End If ' Possible conversions from Char follow.
            If typeCode1 = TypeCode.Char Then
                Select Case typeCode2
                    Case TypeCode.UInt16
                        Return True
                    Case TypeCode.UInt32
                        Return True
                    Case TypeCode.Int32
                        Return True
                    Case TypeCode.UInt64
                        Return True
                    Case TypeCode.Int64
                        Return True
                    Case TypeCode.Single
                        Return True
                    Case TypeCode.Double
                        Return True
                    Case Else
                        Return False
                End Select
            End If ' Possible conversions from Byte follow.
            If typeCode1 = TypeCode.Byte Then
                Select Case typeCode2
                    Case TypeCode.Char
                        Return True
                    Case TypeCode.UInt16
                        Return True
                    Case TypeCode.Int16
                        Return True
                    Case TypeCode.UInt32
                        Return True
                    Case TypeCode.Int32
                        Return True
                    Case TypeCode.UInt64
                        Return True
                    Case TypeCode.Int64
                        Return True
                    Case TypeCode.Single
                        Return True
                    Case TypeCode.Double
                        Return True
                    Case Else
                        Return False
                End Select
            End If ' Possible conversions from SByte follow.
            If typeCode1 = TypeCode.SByte Then
                Select Case typeCode2
                    Case TypeCode.Int16
                        Return True
                    Case TypeCode.Int32
                        Return True
                    Case TypeCode.Int64
                        Return True
                    Case TypeCode.Single
                        Return True
                    Case TypeCode.Double
                        Return True
                    Case Else
                        Return False
                End Select
            End If ' Possible conversions from UInt16 follow.
            If typeCode1 = TypeCode.UInt16 Then
                Select Case typeCode2
                    Case TypeCode.UInt32
                        Return True
                    Case TypeCode.Int32
                        Return True
                    Case TypeCode.UInt64
                        Return True
                    Case TypeCode.Int64
                        Return True
                    Case TypeCode.Single
                        Return True
                    Case TypeCode.Double
                        Return True
                    Case Else
                        Return False
                End Select
            End If ' Possible conversions from Int16 follow.
            If typeCode1 = TypeCode.Int16 Then
                Select Case typeCode2
                    Case TypeCode.Int32
                        Return True
                    Case TypeCode.Int64
                        Return True
                    Case TypeCode.Single
                        Return True
                    Case TypeCode.Double
                        Return True
                    Case Else
                        Return False
                End Select
            End If ' Possible conversions from UInt32 follow.
            If typeCode1 = TypeCode.UInt32 Then
                Select Case typeCode2
                    Case TypeCode.UInt64
                        Return True
                    Case TypeCode.Int64
                        Return True
                    Case TypeCode.Single
                        Return True
                    Case TypeCode.Double
                        Return True
                    Case Else
                        Return False
                End Select
            End If ' Possible conversions from Int32 follow.
            If typeCode1 = TypeCode.Int32 Then
                Select Case typeCode2
                    Case TypeCode.Int64
                        Return True
                    Case TypeCode.Single
                        Return True
                    Case TypeCode.Double
                        Return True
                    Case Else
                        Return False
                End Select
            End If ' Possible conversions from UInt64 follow.
            If typeCode1 = TypeCode.UInt64 Then
                Select Case typeCode2
                    Case TypeCode.Single
                        Return True
                    Case TypeCode.Double
                        Return True
                    Case Else
                        Return False
                End Select
            End If ' Possible conversions from Int64 follow.
            If typeCode1 = TypeCode.Int64 Then
                Select Case typeCode2
                    Case TypeCode.Single
                        Return True
                    Case TypeCode.Double
                        Return True
                    Case Else
                        Return False
                End Select
            End If ' Possible conversions from Single follow.
            If typeCode1 = TypeCode.Single Then
                Select Case typeCode2
                    Case TypeCode.Double
                        Return True
                    Case Else
                        Return False
                End Select
            End If
        End If
        Return False
    End Function 'CanConvertFrom
End Class


Public Class MyClass1
    Public myFieldB As Short
    Public myFieldA As Integer

    Public Overloads Sub MyMethod(ByVal i As Long, ByVal k As Char)
        Console.WriteLine(ControlChars.NewLine & "This is MyMethod(long i, char k).")
    End Sub

    Public Overloads Sub MyMethod(ByVal i As Long, ByVal j As Long)
        Console.WriteLine(ControlChars.NewLine & "This is MyMethod(long i, long j).")
    End Sub
End Class


Public Class Binder_Example
    Public Shared Sub Main()
        ' Get the type of MyClass1.
        Dim myType As Type = GetType(MyClass1)
        ' Get the instance of MyClass1.
        Dim myInstance As New MyClass1()
        Console.WriteLine(ControlChars.Cr & "Displaying the results of using the MyBinder binder.")
        Console.WriteLine()
        ' Get the method information for MyMethod.
        Dim myMethod As MethodInfo = myType.GetMethod("MyMethod", BindingFlags.Public Or BindingFlags.Instance, New MyBinder(), New Type() {GetType(Short), GetType(Short)}, Nothing)
        Console.WriteLine(MyMethod)
        ' Invoke MyMethod.
        myMethod.Invoke(myInstance, BindingFlags.InvokeMethod, New MyBinder(), New [Object]() {CInt(32), CInt(32)}, CultureInfo.CurrentCulture)
    End Sub
End Class

Uwagi

Dynamicznie wywołuje metodę odzwierciedloną przez to wystąpienie w obji przekazuje je na podstawie określonych parametrów.Dynamically invokes the method reflected by this instance on obj, and passes along the specified parameters. Jeśli metoda jest statyczna, parametr obj jest ignorowany.If the method is static, the obj parameter is ignored. Dla metod niestatycznych obj powinna być wystąpieniem klasy, która dziedziczy lub deklaruje metodę i musi być tego samego typu co Klasa.For non-static methods, obj should be an instance of a class that inherits or declares the method and must be the same type as this class. Jeśli metoda nie ma parametrów, wartość parameters powinna być null.If the method has no parameters, the value of parameters should be null. W przeciwnym razie liczba, typ i kolejność elementów w parameters powinna być taka sama jak liczba, typ i kolejność parametrów dla metody odzwierciedlonej przez to wystąpienie.Otherwise, the number, type, and order of elements in parameters should be identical to the number, type, and order of parameters for the method reflected by this instance.

Nie można pominąć parametrów opcjonalnych w wywołaniach do Invoke.You may not omit optional parameters in calls to Invoke. Aby wywołać metodę pomijania parametrów opcjonalnych, należy wywołać Type.InvokeMember zamiast tego.To invoke a method omitting optional parameters, you should call Type.InvokeMember instead.

Uwaga

Jeśli to Przeciążenie metody jest używane do wywołania konstruktora wystąpienia, obiekt dostarczony dla obj jest zainicjowany ponownie; oznacza to, że wszystkie inicjatory wystąpień są wykonywane.If this method overload is used to invoke an instance constructor, the object supplied for obj is reinitialized; that is, all instance initializers are executed. Wartość zwracana jest null.The return value is null. Jeśli Konstruktor klasy jest wywoływany, Klasa zostanie zainicjowana ponownie; oznacza to, że wszystkie inicjatory klas są wykonywane.If a class constructor is invoked, the class is reinitialized; that is, all class initializers are executed. Wartość zwracana jest null.The return value is null.

W przypadku parametrów pierwotnych przekazywanych przez wartość normalne rozszerzanie jest wykonywane (na przykład Int16-> Int32).For pass-by-value primitive parameters, normal widening is performed (Int16 -> Int32, for example). W przypadku parametrów odniesienia przekazywanych przez wartość normalne rozszerzanie odwołania jest dozwolone (Klasa pochodna do klasy podstawowej i Klasa bazowa do typu interfejsu).For pass-by-value reference parameters, normal reference widening is allowed (derived class to base class, and base class to interface type). Jednak w przypadku parametrów pierwotnych przekazywanych przez odwołanie typy muszą dokładnie pasować.However, for pass-by-reference primitive parameters, the types must match exactly. W przypadku parametrów referencyjnych przekazywanych przez odwołanie nadal obowiązuje normalne rozszerzanie.For pass-by-reference reference parameters, the normal widening still applies.

Na przykład jeśli metoda odzwierciedlona przez to wystąpienie jest zadeklarowana jako public boolean Compare(String a, String b), wówczas parameters powinna być tablicą Objects o długości 2, takiej jak parameters[0] = new Object("SomeString1") and parameters[1] = new Object("SomeString2").For example, if the method reflected by this instance is declared as public boolean Compare(String a, String b), then parameters should be an array of Objects with length 2 such that parameters[0] = new Object("SomeString1") and parameters[1] = new Object("SomeString2").

Jeśli parametr bieżącej metody jest typem wartości, a odpowiadający mu argument w parameters jest null, środowisko uruchomieniowe przekazuje wystąpienie typu wartości, które jest inicjowane zero.If a parameter of the current method is a value type, and the corresponding argument in parameters is null, the runtime passes a zero-initialized instance of the value type.

Odbicie używa metody dynamicznej Lookup podczas wywoływania metod wirtualnych.Reflection uses dynamic method lookup when invoking virtual methods. Załóżmy na przykład, że klasa B dziedziczy z klasy A i obie implementują metodę wirtualną o nazwie M. Teraz Załóżmy, że masz obiekt MethodInfo, który reprezentuje element M w klasie A. W przypadku użycia metody Invoke do wywołania M na obiekcie typu B, odbicie będzie używać implementacji określonej przez klasę B. Nawet jeśli obiekt typu B jest rzutowany do, używana jest implementacja określona przez klasę B (Zobacz przykład kodu poniżej).For example, suppose that class B inherits from class A and both implement a virtual method named M. Now suppose that you have a MethodInfo object that represents M on class A. If you use the Invoke method to invoke M on an object of type B, then reflection will use the implementation given by class B. Even if the object of type B is cast to A, the implementation given by class B is used (see code sample below).

Z drugiej strony, jeśli metoda jest niewirtualna, odbicie będzie używać implementacji podaną przez typ, z którego uzyskano MethodInfo, niezależnie od typu obiektu przekazanego jako element docelowy.On the other hand, if the method is non-virtual, then reflection will use the implementation given by the type from which the MethodInfo was obtained, regardless of the type of the object passed as the target.

Ograniczenia dostępu są ignorowane dla w pełni zaufanego kodu.Access restrictions are ignored for fully trusted code. Oznacza to, że prywatne konstruktory, metody, pola i właściwości są dostępne i wywoływane za pośrednictwem odbicia za każdym razem, gdy kod jest w pełni zaufany.That is, private constructors, methods, fields, and properties can be accessed and invoked via reflection whenever the code is fully trusted.

Jeśli wywołana metoda zgłasza wyjątek, TargetInvocationException.GetException zwraca wyjątek.If the invoked method throws an exception, TargetInvocationException.GetException returns the exception. Ta implementacja zwraca klasę NotSupportedException.This implementation throws a NotSupportedException.

Uwaga

Począwszy od .NET Framework 2.0 z dodatkiem Service Pack 1.NET Framework 2.0 Service Pack 1, ta metoda może być używana w celu uzyskania dostępu do niepublicznych składowych, jeśli obiekt wywołujący został przyznany ReflectionPermission z flagą ReflectionPermissionFlag.RestrictedMemberAccess i jeśli zestaw uprawnień niepublicznych składowych jest ograniczony do zestawu uprawnień obiektu wywołującego lub jego podzbioru.Starting with the .NET Framework 2.0 z dodatkiem Service Pack 1.NET Framework 2.0 Service Pack 1, this method can be used to access non-public members if the caller has been granted ReflectionPermission with the ReflectionPermissionFlag.RestrictedMemberAccess flag and if the grant set of the non-public members is restricted to the caller's grant set, or a subset thereof. (Zobacz zagadnienia dotyczące zabezpieczeń w przypadku odbicia).(See Security Considerations for Reflection.)

Aby użyć tej funkcji, aplikacja powinna kierować do Program .NET Framework 3,5.NET Framework 3.5 lub później.To use this functionality, your application should target the Program .NET Framework 3,5.NET Framework 3.5 or later.

Zobacz też

Dotyczy