Udostępnij za pośrednictwem


Type.InvokeMember Metoda

Definicja

Wywołuje określonego członka bieżącego Typeelementu .

Przeciążenia

InvokeMember(String, BindingFlags, Binder, Object, Object[])

Wywołuje określony element członkowski przy użyciu określonych ograniczeń powiązania i dopasowania do określonej listy argumentów.

InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo)

Wywołuje określony element członkowski przy użyciu określonych ograniczeń powiązania i dopasowania określonej listy argumentów i kultury.

InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])

Podczas zastępowania w klasie pochodnej wywołuje określony element członkowski przy użyciu określonych ograniczeń powiązania i dopasowania określonej listy argumentów, modyfikatorów i kultury.

InvokeMember(String, BindingFlags, Binder, Object, Object[])

Źródło:
Type.cs
Źródło:
Type.cs
Źródło:
Type.cs

Wywołuje określony element członkowski przy użyciu określonych ograniczeń powiązania i dopasowywania określonej listy argumentów.

public:
 System::Object ^ InvokeMember(System::String ^ name, System::Reflection::BindingFlags invokeAttr, System::Reflection::Binder ^ binder, System::Object ^ target, cli::array <System::Object ^> ^ args);
public:
 virtual System::Object ^ InvokeMember(System::String ^ name, System::Reflection::BindingFlags invokeAttr, System::Reflection::Binder ^ binder, System::Object ^ target, cli::array <System::Object ^> ^ args);
public object? InvokeMember (string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args);
public object InvokeMember (string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object target, object[] args);
member this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] -> obj
abstract member InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] -> obj
override this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] -> obj
Public Function InvokeMember (name As String, invokeAttr As BindingFlags, binder As Binder, target As Object, args As Object()) As Object

Parametry

name
String

Ciąg zawierający nazwę konstruktora, metody, właściwości lub elementu członkowskiego pola do wywołania.

-lub-

Pusty ciąg ("") wywołujący domyślny element członkowski.

-lub-

W przypadku IDispatch elementów członkowskich ciąg reprezentujący identyfikator DispID, na przykład "[DispID=3]".

invokeAttr
BindingFlags

Bitowa kombinacja wartości wyliczenia, które określają sposób przeprowadzania wyszukiwania. Dostęp może być jednym z takich elementów BindingFlags jak Public, NonPublic, Private, InvokeMethod, , GetFieldi tak dalej. Nie trzeba określać typu odnośnika. Jeśli typ wyszukiwania zostanie pominięty, BindingFlags.Public | | BindingFlags.InstanceBindingFlags.Static są używane.

binder
Binder

Obiekt, który określa zestaw właściwości i umożliwia powiązanie, które może obejmować wybór metody przeciążonej, wymuszanie typów argumentu i wywołanie elementu członkowskiego przez odbicie.

-lub-

Odwołanie o wartości null (Nothing w Visual Basic) do używania elementu DefaultBinder. Należy pamiętać, że jawne zdefiniowanie Binder obiektu może być wymagane do pomyślnego wywołania przeciążeń metody z argumentami zmiennych.

target
Object

Obiekt, na którym ma być wywoływany określony element członkowski.

args
Object[]

Tablica zawierająca argumenty, które mają być przekazywane do elementu członkowskiego do wywołania.

Zwraca

Obiekt reprezentujący zwracaną wartość wywoływanego elementu członkowskiego.

Implementuje

Wyjątki

invokeAttr nie zawiera CreateInstance i name ma wartość null.

invokeAttr nie jest prawidłowym BindingFlags atrybutem.

-lub-

invokeAttrnie zawiera jednej z następujących flag powiązania: InvokeMethod, , CreateInstance, GetFieldSetField, GetPropertylub SetProperty.

-lub-

invokeAttr zawiera CreateInstance w połączeniu z InvokeMethod, GetField, SetField, GetProperty, lub SetProperty.

-lub-

invokeAttr zawiera zarówno elementy , jak GetField i SetField.

-lub-

invokeAttr zawiera zarówno elementy , jak GetProperty i SetProperty.

-lub-

invokeAttr zawiera InvokeMethod ciąg w połączeniu z parametrami SetField lub SetProperty.

-lub-

invokeAttr element zawiera SetField element i args zawiera więcej niż jeden element.

-lub-

Ta metoda jest wywoływana w obiekcie COM i nie przekazano jednej z następujących flag powiązania: BindingFlags.InvokeMethod, , BindingFlags.GetPropertyBindingFlags.SetProperty, BindingFlags.PutDispPropertylub BindingFlags.PutRefDispProperty.

-lub-

Jedna z nazwanych tablic parametrów zawiera ciąg o nazwie null.

Określony element członkowski jest inicjatorem klasy.

Nie można odnaleźć pola lub właściwości.

Nie można odnaleźć metody zgodnej z argumentami w pliku args.

-lub-

Bieżący Type obiekt reprezentuje typ, który zawiera parametry typu otwartego, czyli ContainsGenericParameters zwraca wartość true.

Nie można wywołać określonego elementu członkowskiego w elemencie target.

Więcej niż jedna metoda jest zgodna z kryteriami powiązania.

Program .NET Compact Framework nie obsługuje obecnie tej metody.

Metoda reprezentowana przez program name ma co najmniej jeden nieokreślony parametr typu ogólnego. Oznacza to, że właściwość metody ContainsGenericParameters zwraca wartość true.

Przykłady

W poniższym przykładzie użyto InvokeMember metody uzyskiwania dostępu do elementów członkowskich typu.

using namespace System;
using namespace System::Reflection;

// This sample class has a field, constructor, method, and property.
ref class MyType
{
private:
   Int32 myField;

public:
   MyType( interior_ptr<Int32> x )
   {
       *x *= 5;
   }

   virtual String^ ToString() override
   {
      return myField.ToString();
   }

   property Int32 MyProp 
   {
      Int32 get()
      {
         return myField;
      }

      void set( Int32 value )
      {
         if ( value < 1 )
                  throw gcnew ArgumentOutOfRangeException( "value",value,"value must be > 0" );

         myField = value;
      }
   }
};

int main()
{
   Type^ t = MyType::typeid;

   // Create an instance of a type.
   array<Object^>^args = {8};
   Console::WriteLine( "The value of x before the constructor is called is {0}.", args[ 0 ] );
   Object^ obj = t->InvokeMember( nullptr, static_cast<BindingFlags>(BindingFlags::DeclaredOnly | BindingFlags::Public | BindingFlags::NonPublic | BindingFlags::Instance | BindingFlags::CreateInstance), nullptr, nullptr, args );
   Console::WriteLine( "Type: {0}", obj->GetType() );
   Console::WriteLine( "The value of x after the constructor returns is {0}.", args[ 0 ] );

   // Read and write to a field.
   array<Object^>^obj5 = {5};
   t->InvokeMember( "myField", static_cast<BindingFlags>(BindingFlags::DeclaredOnly | BindingFlags::Public | BindingFlags::NonPublic | BindingFlags::Instance | BindingFlags::SetField), nullptr, obj, obj5 );
   Int32 v = safe_cast<Int32>(t->InvokeMember( "myField", static_cast<BindingFlags>(BindingFlags::DeclaredOnly | BindingFlags::Public | BindingFlags::NonPublic | BindingFlags::Instance | BindingFlags::GetField), nullptr, obj, nullptr ));
   Console::WriteLine( "myField: {0}", v );

   // Call a method.
   String^ s = safe_cast<String^>(t->InvokeMember( "ToString", static_cast<BindingFlags>(BindingFlags::DeclaredOnly | BindingFlags::Public | BindingFlags::NonPublic | BindingFlags::Instance | BindingFlags::InvokeMethod), nullptr, obj, nullptr ));
   Console::WriteLine( "ToString: {0}", s );

   // Read and write a property. First, attempt to assign an
   // invalid value; then assign a valid value; finally, get
   // the value.
   try
   {
      // Assign the value zero to MyProp. The Property Set 
      // throws an exception, because zero is an invalid value.
      // InvokeMember catches the exception, and throws 
      // TargetInvocationException. To discover the real cause
      // you must catch TargetInvocationException and examine
      // the inner exception. 
      array<Object^>^obj0 = {(int^)0};
      t->InvokeMember( "MyProp", static_cast<BindingFlags>(BindingFlags::DeclaredOnly | BindingFlags::Public | BindingFlags::NonPublic | BindingFlags::Instance | BindingFlags::SetProperty), nullptr, obj, obj0 );
   }
   catch ( TargetInvocationException^ e ) 
   {
      // If the property assignment failed for some unexpected
      // reason, rethrow the TargetInvocationException.
      if ( e->InnerException->GetType() != ArgumentOutOfRangeException::typeid )
            throw;

      Console::WriteLine( "An invalid value was assigned to MyProp." );
   }

   array<Object^>^obj2 = {2};
   t->InvokeMember( "MyProp", static_cast<BindingFlags>(BindingFlags::DeclaredOnly | BindingFlags::Public | BindingFlags::NonPublic | BindingFlags::Instance | BindingFlags::SetProperty), nullptr, obj, obj2 );
   v =  safe_cast<Int32>(t->InvokeMember( "MyProp", static_cast<BindingFlags>(BindingFlags::DeclaredOnly | BindingFlags::Public | BindingFlags::NonPublic | BindingFlags::Instance | BindingFlags::GetProperty), nullptr, obj, nullptr ));
   Console::WriteLine( "MyProp: {0}", v );
}
using System;
using System.Reflection;

// This sample class has a field, constructor, method, and property.
class MyType
{
    Int32 myField;
    public MyType(ref Int32 x) {x *= 5;}
    public override String ToString() {return myField.ToString();}
    public Int32 MyProp
    {
        get {return myField;}
        set
        {
            if (value < 1)
                throw new ArgumentOutOfRangeException("value", value, "value must be > 0");
            myField = value;
        }
    }
}

class MyApp
{
    static void Main()
    {
        Type t = typeof(MyType);
        // Create an instance of a type.
        Object[] args = new Object[] {8};
        Console.WriteLine("The value of x before the constructor is called is {0}.", args[0]);
        Object obj = t.InvokeMember(null,
            BindingFlags.DeclaredOnly |
            BindingFlags.Public | BindingFlags.NonPublic |
            BindingFlags.Instance | BindingFlags.CreateInstance, null, null, args);
        Console.WriteLine("Type: " + obj.GetType().ToString());
        Console.WriteLine("The value of x after the constructor returns is {0}.", args[0]);

        // Read and write to a field.
        t.InvokeMember("myField",
            BindingFlags.DeclaredOnly |
            BindingFlags.Public | BindingFlags.NonPublic |
            BindingFlags.Instance | BindingFlags.SetField, null, obj, new Object[] {5});
        Int32 v = (Int32) t.InvokeMember("myField",
            BindingFlags.DeclaredOnly |
            BindingFlags.Public | BindingFlags.NonPublic |
            BindingFlags.Instance | BindingFlags.GetField, null, obj, null);
        Console.WriteLine("myField: " + v);

        // Call a method.
        String s = (String) t.InvokeMember("ToString",
            BindingFlags.DeclaredOnly |
            BindingFlags.Public | BindingFlags.NonPublic |
            BindingFlags.Instance | BindingFlags.InvokeMethod, null, obj, null);
        Console.WriteLine("ToString: " + s);

        // Read and write a property. First, attempt to assign an
        // invalid value; then assign a valid value; finally, get
        // the value.
        try
        {
            // Assign the value zero to MyProp. The Property Set
            // throws an exception, because zero is an invalid value.
            // InvokeMember catches the exception, and throws
            // TargetInvocationException. To discover the real cause
            // you must catch TargetInvocationException and examine
            // the inner exception.
            t.InvokeMember("MyProp",
                BindingFlags.DeclaredOnly |
                BindingFlags.Public | BindingFlags.NonPublic |
                BindingFlags.Instance | BindingFlags.SetProperty, null, obj, new Object[] {0});
        }
        catch (TargetInvocationException e)
        {
            // If the property assignment failed for some unexpected
            // reason, rethrow the TargetInvocationException.
            if (e.InnerException.GetType() !=
                typeof(ArgumentOutOfRangeException))
                throw;
            Console.WriteLine("An invalid value was assigned to MyProp.");
        }
        t.InvokeMember("MyProp",
            BindingFlags.DeclaredOnly |
            BindingFlags.Public | BindingFlags.NonPublic |
            BindingFlags.Instance | BindingFlags.SetProperty, null, obj, new Object[] {2});
        v = (Int32) t.InvokeMember("MyProp",
            BindingFlags.DeclaredOnly |
            BindingFlags.Public | BindingFlags.NonPublic |
            BindingFlags.Instance | BindingFlags.GetProperty, null, obj, null);
        Console.WriteLine("MyProp: " + v);
    }
}
open System
open System.Reflection

// This sample class has a field, constructor, method, and property.
type MyType() =
    let mutable myField = 0

    member _.MyType(x: int byref) =
        x <- x * 5
    
    override _.ToString() =
        string myField
    
    member _.MyProp
        with get () = myField
        and set value =
            if value < 1 then
                raise (ArgumentOutOfRangeException("value", value, "value must be > 0"))
            myField <- value

let t = typeof<MyType>
// Create an instance of a type.
let args = Array.zeroCreate<obj> 8
printfn $"The value of x before the constructor is called is {args[0]}."
let obj = t.InvokeMember(null,
    BindingFlags.DeclaredOnly |||
    BindingFlags.Public ||| BindingFlags.NonPublic |||
    BindingFlags.Instance ||| BindingFlags.CreateInstance, null, null, args)
printfn $"Type: {obj.GetType()}"
printfn $"The value of x after the constructor returns is {args[0]}."

// Read and write to a field.
t.InvokeMember("myField",
    BindingFlags.DeclaredOnly |||
    BindingFlags.Public ||| BindingFlags.NonPublic |||
    BindingFlags.Instance ||| BindingFlags.SetField, null, obj, Array.zeroCreate<obj> 5) |> ignore
let v = t.InvokeMember("myField",
    BindingFlags.DeclaredOnly |||
    BindingFlags.Public ||| BindingFlags.NonPublic |||
    BindingFlags.Instance ||| BindingFlags.GetField, null, obj, null) :?> int
printfn $"myField: {v}"

// Call a method.
let s = t.InvokeMember("ToString",
    BindingFlags.DeclaredOnly |||
    BindingFlags.Public ||| BindingFlags.NonPublic |||
    BindingFlags.Instance ||| BindingFlags.InvokeMethod, null, obj, null) :?> string
printfn $"ToString: {s}"

// Read and write a property. First, attempt to assign an
// invalid value then assign a valid value finally, get
// the value.
try
    // Assign the value zero to MyProp. The Property Set
    // throws an exception, because zero is an invalid value.
    // InvokeMember catches the exception, and throws
    // TargetInvocationException. To discover the real cause
    // you must catch TargetInvocationException and examine
    // the inner exception.
    t.InvokeMember("MyProp",
        BindingFlags.DeclaredOnly |||
        BindingFlags.Public ||| BindingFlags.NonPublic |||
        BindingFlags.Instance ||| BindingFlags.SetProperty, null, obj, Array.zeroCreate<obj> 0) |> ignore
with :? TargetInvocationException as e ->
    // If the property assignment failed for some unexpected
    // reason, rethrow the TargetInvocationException.
    if e.InnerException.GetType() <> typeof<ArgumentOutOfRangeException> then
        reraise ()
    printfn "An invalid value was assigned to MyProp."
t.InvokeMember("MyProp",
    BindingFlags.DeclaredOnly |||
    BindingFlags.Public ||| BindingFlags.NonPublic |||
    BindingFlags.Instance ||| BindingFlags.SetProperty, null, obj, Array.zeroCreate<obj> 2) |> ignore
let v2 = t.InvokeMember("MyProp",
    BindingFlags.DeclaredOnly |||
    BindingFlags.Public ||| BindingFlags.NonPublic |||
    BindingFlags.Instance ||| BindingFlags.GetProperty, null, obj, null)
printfn $"MyProp: {v2}"
Imports System.Reflection

' This sample class has a field, constructor, method, and property.
Class MyType
    Private myField As Int32

    Public Sub New(ByRef x As Int32)
        x *= 5
    End Sub

    Public Overrides Function ToString() As [String]
        Return myField.ToString()
    End Function 'ToString

    Public Property MyProp() As Int32
        Get
            Return myField
        End Get
        Set(ByVal Value As Int32)
            If Value < 1 Then
                Throw New ArgumentOutOfRangeException("value", Value, "value must be > 0")
            End If
            myField = Value
        End Set
    End Property
End Class

Class MyApp

    Shared Sub Main()
        Dim t As Type = GetType(MyType)
        ' Create an instance of a type.
        Dim args() As [Object] = {8}
        Console.WriteLine("The value of x before the constructor is called is {0}.", args(0))
        Dim obj As [Object] = t.InvokeMember(Nothing, BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.CreateInstance, Nothing, Nothing, args)
        Console.WriteLine("Type: {0}", obj.GetType().ToString())
        Console.WriteLine("The value of x after the constructor returns is {0}.", args(0))

        ' Read and write to a field.
        t.InvokeMember("myField", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.SetField, Nothing, obj, New [Object]() {5})
        Dim v As Int32 = CType(t.InvokeMember("myField", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.GetField, Nothing, obj, Nothing), Int32)
        Console.WriteLine("myField: {0}", v)

        ' Call a method.
        Dim s As [String] = CType(t.InvokeMember("ToString", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.InvokeMethod, Nothing, obj, Nothing), [String])
        Console.WriteLine("ToString: {0}", s)

        ' Read and write a property. First, attempt to assign an
        ' invalid value; then assign a valid value; finally, get
        ' the value.
        Try
            ' Assign the value zero to MyProp. The Property Set 
            ' throws an exception, because zero is an invalid value.
            ' InvokeMember catches the exception, and throws 
            ' TargetInvocationException. To discover the real cause
            ' you must catch TargetInvocationException and examine
            ' the inner exception. 
            t.InvokeMember("MyProp", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.SetProperty, Nothing, obj, New [Object]() {0})
        Catch e As TargetInvocationException
            ' If the property assignment failed for some unexpected
            ' reason, rethrow the TargetInvocationException.
            If Not e.InnerException.GetType() Is GetType(ArgumentOutOfRangeException) Then
                Throw
            End If
            Console.WriteLine("An invalid value was assigned to MyProp.")
        End Try
        t.InvokeMember("MyProp", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.SetProperty, Nothing, obj, New [Object]() {2})
        v = CType(t.InvokeMember("MyProp", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.GetProperty, Nothing, obj, Nothing), Int32)
        Console.WriteLine("MyProp: {0}", v)
    End Sub
End Class

Uwagi

Uwaga

Nie można użyć InvokeMember metody do wywołania metody ogólnej.

Następujące BindingFlags flagi filtru mogą służyć do definiowania elementów członkowskich do uwzględnienia w wyszukiwaniu:

  • Określ BindingFlags.Public , aby uwzględnić członków publicznych w wyszukiwaniu.

  • Określ BindingFlags.NonPublic , aby uwzględnić w wyszukiwaniu niepublice elementy członkowskie (czyli prywatne i chronione elementy członkowskie).

  • Określ BindingFlags.FlattenHierarchy , aby uwzględnić statyczne elementy członkowskie w górę hierarchii.

Następujące BindingFlags flagi modyfikatora mogą służyć do zmiany sposobu działania wyszukiwania:

  • BindingFlags.IgnoreCaseaby zignorować przypadek .name

  • BindingFlags.DeclaredOnly aby wyszukać tylko elementy członkowskie zadeklarowane w elemecie Type, a nie na elementach członkowskich, które zostały po prostu odziedziczone.

BindingFlags Następujące flagi wywołania mogą służyć do określenia akcji do wykonania z elementem członkowskim:

  • CreateInstance w celu wywołania konstruktora. Parametr name jest ignorowany. Nieprawidłowy z innymi flagami wywołania.

  • InvokeMethod aby wywołać metodę, ale nie konstruktora lub inicjatora typu. Nieprawidłowy dla polecenia SetField lub SetProperty. Jeśli InvokeMethod jest określony przez siebie, BindingFlags.Public, BindingFlags.Instancei BindingFlags.Static są automatycznie dołączane.

  • GetField aby uzyskać wartość pola. Nieprawidłowy z .SetField

  • SetField , aby ustawić wartość pola. Nieprawidłowy z .GetField

  • GetProperty aby uzyskać właściwość. Nieprawidłowy z .SetProperty

  • SetProperty , aby ustawić właściwość. Nieprawidłowy z .GetProperty

Aby uzyskać więcej informacji, zobacz System.Reflection.BindingFlags.

Metoda zostanie wywołana, jeśli oba następujące warunki są spełnione:

  • Liczba parametrów w deklaracji metody jest równa liczbie argumentów w args tablicy (chyba że argumenty domyślne są zdefiniowane w elemencie członkowskim i BindingFlags.OptionalParamBinding jest określony).

  • Typ każdego argumentu można przekonwertować przez binder na typ parametru.

Binder znajdzie wszystkie pasujące metody. Te metody można znaleźć na podstawie typu żądanego powiązania (BindingFlags wartości InvokeMethod, GetPropertyitd.). Zestaw metod jest filtrowany według nazwy, liczby argumentów i zestawu modyfikatorów wyszukiwania zdefiniowanych w binderze.

Po wybraniu metody zostanie ona wywołana. Dostępność jest sprawdzana w tym momencie. Wyszukiwanie może kontrolować, który zestaw metod jest przeszukiwany na podstawie atrybutu ułatwień dostępu skojarzonego z metodą . Metoda Binder.BindToMethodBinder klasy jest odpowiedzialna za wybranie metody do wywołania. Domyślny binder wybiera najbardziej konkretne dopasowanie.

Ograniczenia dostępu są ignorowane dla w pełni zaufanego kodu; oznacza to, że dostęp do prywatnych konstruktorów, metod, pól i właściwości można uzyskiwać i wywoływać za pośrednictwem System.Reflection każdego, gdy kod jest w pełni zaufany.

Możesz użyć Type.InvokeMember polecenia , aby ustawić pole na określoną wartość, określając wartość BindingFlags.SetField. Jeśli na przykład chcesz ustawić pole wystąpienia publicznego o nazwie F w klasie C, a F to String, możesz użyć kodu takiego jak:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"});

Jeśli język F to String[], możesz użyć kodu, takiego jak:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}});

co spowoduje zainicjowanie pola F do tej nowej tablicy. Można również użyć Type.InvokeMember polecenia , aby ustawić pozycję w tablicy, podając indeks wartości, a następnie następną wartość przy użyciu kodu, takiego jak:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"});

Spowoduje to zmianę ciągu "z" w tablicy, która zawiera ciąg "b".

Podczas wywoływania IDispatch elementu członkowskiego można określić identyfikator DispID zamiast nazwy elementu członkowskiego przy użyciu formatu ciągu "[DispID=##]". Jeśli na przykład identyfikator DispID elementu MyComMethod ma wartość 3, możesz określić ciąg "[DispID=3]" zamiast "MyComMethod". Wywoływanie elementu członkowskiego przez DispID jest szybsze niż wyszukanie elementu członkowskiego według nazwy. W złożonych scenariuszach agregacji identyfikator DispID jest czasami jedynym sposobem wywoływania żądanego elementu członkowskiego.

Uwaga

Począwszy od .NET Framework 2.0 z dodatkiem Service Pack 1, ta metoda może służyć do uzyskiwania dostępu do niepublizowanych elementów członkowskich, jeśli obiekt wywołujący otrzymał ReflectionPermissionReflectionPermissionFlag.RestrictedMemberAccess flagę, a zestaw dotacji niepublizowanych członków jest ograniczony do zestawu dotacji osoby wywołującej lub jego podzbioru. (Zobacz Zagadnienia dotyczące zabezpieczeń do odbicia).

Aby korzystać z tej funkcji, aplikacja powinna być docelowa dla .NET Framework 3.5 lub nowszej.

Zobacz też

Dotyczy

InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo)

Źródło:
Type.cs
Źródło:
Type.cs
Źródło:
Type.cs

Wywołuje określony element członkowski przy użyciu określonych ograniczeń powiązania i dopasowywania określonej listy argumentów i kultury.

public:
 System::Object ^ InvokeMember(System::String ^ name, System::Reflection::BindingFlags invokeAttr, System::Reflection::Binder ^ binder, System::Object ^ target, cli::array <System::Object ^> ^ args, System::Globalization::CultureInfo ^ culture);
public:
 virtual System::Object ^ InvokeMember(System::String ^ name, System::Reflection::BindingFlags invokeAttr, System::Reflection::Binder ^ binder, System::Object ^ target, cli::array <System::Object ^> ^ args, System::Globalization::CultureInfo ^ culture);
public object? InvokeMember (string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args, System.Globalization.CultureInfo? culture);
public object InvokeMember (string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object target, object[] args, System.Globalization.CultureInfo culture);
member this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Globalization.CultureInfo -> obj
abstract member InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Globalization.CultureInfo -> obj
override this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Globalization.CultureInfo -> obj
Public Function InvokeMember (name As String, invokeAttr As BindingFlags, binder As Binder, target As Object, args As Object(), culture As CultureInfo) As Object

Parametry

name
String

Ciąg zawierający nazwę konstruktora, metody, właściwości lub elementu członkowskiego pola do wywołania.

-lub-

Pusty ciąg ("") do wywołania domyślnego elementu członkowskiego.

-lub-

W przypadku IDispatch elementów członkowskich ciąg reprezentujący identyfikator DispID, na przykład "[DispID=3]".

invokeAttr
BindingFlags

Bitowa kombinacja wartości wyliczenia, które określają sposób przeprowadzania wyszukiwania. Dostęp może być jednym z BindingFlags takich elementów jak Public, NonPublic, Private, InvokeMethod, , GetFieldi tak dalej. Nie trzeba określać typu odnośnika. Jeśli typ odnośnika zostanie pominięty, BindingFlags.Public | | BindingFlags.InstanceBindingFlags.Static są używane.

binder
Binder

Obiekt, który określa zestaw właściwości i umożliwia powiązanie, które może obejmować wybór metody przeciążonej, wymuszanie typów argumentu i wywołanie elementu członkowskiego przez odbicie.

-lub-

Odwołanie o wartości null (Nothing w Visual Basic) do używania elementu DefaultBinder. Należy pamiętać, że jawne zdefiniowanie Binder obiektu może być wymagane do pomyślnego wywołania przeciążeń metody z argumentami zmiennych.

target
Object

Obiekt, na którym ma wywołać określony element członkowski.

args
Object[]

Tablica zawierająca argumenty, które mają być przekazywane do elementu członkowskiego do wywołania.

culture
CultureInfo

Obiekt reprezentujący ustawienia regionalne globalizacji do użycia, które mogą być niezbędne do konwersji specyficznych dla ustawień regionalnych, takich jak konwertowanie liczb String na wartość Double.

-lub-

Odwołanie o wartości null (Nothing w Visual Basic) do używania bieżącego wątku CultureInfo.

Zwraca

Obiekt reprezentujący zwracaną wartość wywoływanego elementu członkowskiego.

Implementuje

Wyjątki

invokeAttr nie zawiera CreateInstance i name ma wartość null.

invokeAttr nie jest prawidłowym BindingFlags atrybutem.

-lub-

invokeAttrnie zawiera jednej z następujących flag powiązania: InvokeMethod, , CreateInstanceGetField, SetField, GetPropertylub SetProperty.

-lub-

invokeAttr zawiera w CreateInstance połączeniu z InvokeMethod, , GetField, SetField, GetPropertylub SetProperty.

-lub-

invokeAttr zawiera zarówno , jak GetField i SetField.

-lub-

invokeAttr zawiera zarówno , jak GetProperty i SetProperty.

-lub-

invokeAttr zawiera InvokeMethod w połączeniu z parametrem SetField lub SetProperty.

-lub-

invokeAttr zawiera SetField i args ma więcej niż jeden element.

-lub-

Ta metoda jest wywoływana w obiekcie COM i jedna z następujących flag powiązania nie została przekazana w: BindingFlags.InvokeMethod, , BindingFlags.GetPropertyBindingFlags.SetProperty, , BindingFlags.PutDispPropertylub BindingFlags.PutRefDispProperty.

-lub-

Jedna z nazwanych tablic parametrów zawiera ciąg o nazwie null.

Określony element członkowski jest inicjatorem klasy.

Nie można odnaleźć pola lub właściwości.

Nie można odnaleźć metody zgodnej z argumentami w elemecie args.

-lub-

Bieżący Type obiekt reprezentuje typ, który zawiera parametry typu otwartego, czyli ContainsGenericParameters zwraca wartość true.

Nie można wywołać określonego elementu członkowskiego w elemencie target.

Więcej niż jedna metoda jest zgodna z kryteriami powiązania.

Metoda reprezentowana przez name element ma co najmniej jeden nieokreślony parametr typu ogólnego. Oznacza to, że właściwość metody ContainsGenericParameters zwraca truewartość .

Uwagi

Chociaż domyślny binder nie przetwarza CultureInfo ( culture parametr), można użyć klasy abstrakcyjnej System.Reflection.Binder do zapisania niestandardowego powiązania, który przetwarza culture.

Uwaga

Nie można InvokeMember wywołać metody ogólnej.

Następujące BindingFlags flagi filtru mogą służyć do definiowania elementów członkowskich do uwzględnienia w wyszukiwaniu:

  • Określ BindingFlags.Public , aby uwzględnić członków publicznych w wyszukiwaniu.

  • Określ BindingFlags.NonPublic , aby uwzględnić niepublizowanych członków (czyli prywatnych, wewnętrznych i chronionych) w wyszukiwaniu.

  • Określ BindingFlags.FlattenHierarchy , aby uwzględnić statyczne elementy członkowskie w hierarchii.

Następujące BindingFlags flagi modyfikatora mogą służyć do zmiany sposobu działania wyszukiwania:

  • BindingFlags.IgnoreCaseaby zignorować przypadek .name

  • BindingFlags.DeclaredOnly aby przeszukać tylko elementy członkowskie zadeklarowane w obiekcie Type, a nie na elementach członkowskich, które zostały po prostu odziedziczone.

BindingFlags Następujące flagi wywołania mogą służyć do określenia akcji, która ma zostać zastosowana do elementu członkowskiego:

  • CreateInstance aby wywołać konstruktor. Parametr name jest ignorowany. Nieprawidłowa z innymi flagami wywołania.

  • InvokeMethod wywołać metodę, ale nie konstruktora lub inicjatora typu. Nieprawidłowa wartość z ciągiem SetField lub SetProperty. Jeśli InvokeMethod jest określony przez siebie, BindingFlags.Public, BindingFlags.Instancei BindingFlags.Static są automatycznie dołączane.

  • GetField aby uzyskać wartość pola. Nieprawidłowa wartość w pliku SetField.

  • SetField aby ustawić wartość pola. Nieprawidłowa wartość w pliku GetField.

  • GetProperty aby uzyskać właściwość. Nieprawidłowa wartość w pliku SetProperty.

  • SetProperty aby ustawić właściwość. Nieprawidłowa wartość w pliku GetProperty.

Aby uzyskać więcej informacji, zobacz System.Reflection.BindingFlags.

Metoda zostanie wywołana, jeśli oba następujące warunki są spełnione:

  • Liczba parametrów w deklaracji metody jest równa liczbie argumentów w args tablicy (chyba że argumenty domyślne są zdefiniowane w elemencie członkowskim i BindingFlags.OptionalParamBinding jest określony).

  • Typ każdego argumentu można przekonwertować przez binder na typ parametru.

Binder znajdzie wszystkie pasujące metody. Te metody można znaleźć na podstawie typu żądanego powiązania (BindingFlags wartości InvokeMethod, GetPropertyitd.). Zestaw metod jest filtrowany według nazwy, liczby argumentów i zestawu modyfikatorów wyszukiwania zdefiniowanych w binderze.

Po wybraniu metody jest wywoływana. Dostępność jest sprawdzana w tym momencie. Wyszukiwanie może kontrolować, który zestaw metod jest wyszukiwany na podstawie atrybutu ułatwień dostępu skojarzonego z metodą. Metoda Binder.BindToMethodBinder klasy jest odpowiedzialna za wybranie metody do wywołania. Domyślny binder wybiera najbardziej specyficzne dopasowanie.

Ograniczenia dostępu są ignorowane dla w pełni zaufanego kodu; to znaczy, prywatne konstruktory, metody, pola i właściwości mogą być dostępne i wywoływane za pośrednictwem odbicia, gdy kod jest w pełni zaufany.

Możesz użyć Type.InvokeMember polecenia , aby ustawić pole na określoną wartość, określając BindingFlags.SetFieldwartość . Jeśli na przykład chcesz ustawić pole wystąpienia publicznego o nazwie F w klasie C, a F to String kod, taki jak:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"}, null);

Jeśli język F to String[], możesz użyć kodu, takiego jak:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}}, null);

które zainicjuje pole F do tej nowej tablicy. Można również użyć Type.InvokeMember polecenia , aby ustawić pozycję w tablicy, podając indeks wartości, a następnie następną wartość przy użyciu kodu, takiego jak:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"}, null);

Spowoduje to zmianę ciągu "z" w tablicy, która zawiera ciąg "b".

Po wywołaniu IDispatch elementu członkowskiego można określić identyfikator DispID zamiast nazwy elementu członkowskiego, używając formatu ciągu "[DispID=##]". Jeśli na przykład identyfikator DispID elementu MyComMethod ma wartość 3, możesz określić ciąg "[DispID=3]" zamiast "MyComMethod". Wywołanie elementu członkowskiego przez dispID jest szybsze niż wyszukanie elementu członkowskiego według nazwy. W złożonych scenariuszach agregacji identyfikator DispID jest czasami jedynym sposobem wywoływania żądanego elementu członkowskiego.

Uwaga

Począwszy od .NET Framework 2.0 z dodatkiem Service Pack 1, ta metoda może służyć do uzyskiwania dostępu do niepublizowanych elementów członkowskich, jeśli obiekt wywołujący otrzymał ReflectionPermissionReflectionPermissionFlag.RestrictedMemberAccess flagę, a zestaw dotacji niepublizowanych członków jest ograniczony do zestawu dotacji osoby wywołującej lub jego podzbioru. (Zobacz Zagadnienia dotyczące zabezpieczeń do odbicia).

Aby korzystać z tej funkcji, aplikacja powinna być docelowa dla .NET Framework 3.5 lub nowszej.

Zobacz też

Dotyczy

InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])

Źródło:
Type.cs
Źródło:
Type.cs
Źródło:
Type.cs

W przypadku zastąpienia w klasie pochodnej wywołuje określony element członkowski, używając określonych ograniczeń powiązań i pasujących do określonej listy argumentów, modyfikatorów i kultury.

public:
 abstract System::Object ^ InvokeMember(System::String ^ name, System::Reflection::BindingFlags invokeAttr, System::Reflection::Binder ^ binder, System::Object ^ target, cli::array <System::Object ^> ^ args, cli::array <System::Reflection::ParameterModifier> ^ modifiers, System::Globalization::CultureInfo ^ culture, cli::array <System::String ^> ^ namedParameters);
public abstract object? InvokeMember (string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args, System.Reflection.ParameterModifier[]? modifiers, System.Globalization.CultureInfo? culture, string[]? namedParameters);
public abstract object InvokeMember (string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object target, object[] args, System.Reflection.ParameterModifier[] modifiers, System.Globalization.CultureInfo culture, string[] namedParameters);
abstract member InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Reflection.ParameterModifier[] * System.Globalization.CultureInfo * string[] -> obj
Public MustOverride Function InvokeMember (name As String, invokeAttr As BindingFlags, binder As Binder, target As Object, args As Object(), modifiers As ParameterModifier(), culture As CultureInfo, namedParameters As String()) As Object

Parametry

name
String

Ciąg zawierający nazwę konstruktora, metody, właściwości lub elementu członkowskiego pola do wywołania.

-lub-

Pusty ciąg ("") do wywołania domyślnego elementu członkowskiego.

-lub-

W przypadku IDispatch elementów członkowskich ciąg reprezentujący identyfikator DispID, na przykład "[DispID=3]".

invokeAttr
BindingFlags

Bitowa kombinacja wartości wyliczenia, które określają sposób przeprowadzania wyszukiwania. Dostęp może być jednym z BindingFlags takich elementów jak Public, NonPublic, Private, InvokeMethod, , GetFieldi tak dalej. Nie trzeba określać typu odnośnika. Jeśli typ odnośnika zostanie pominięty, BindingFlags.Public | | BindingFlags.InstanceBindingFlags.Static są używane.

binder
Binder

Obiekt, który określa zestaw właściwości i umożliwia powiązanie, które może obejmować wybór metody przeciążonej, wymuszanie typów argumentu i wywołanie elementu członkowskiego przez odbicie.

-lub-

Odwołanie o wartości null (Nic w Visual Basic) do używania elementu DefaultBinder. Należy pamiętać, że jawne zdefiniowanie Binder obiektu może być wymagane do pomyślnego wywołania przeciążeń metody z argumentami zmiennych.

target
Object

Obiekt, na którym ma wywołać określony element członkowski.

args
Object[]

Tablica zawierająca argumenty, które mają być przekazywane do elementu członkowskiego do wywołania.

modifiers
ParameterModifier[]

Tablica ParameterModifier obiektów reprezentujących atrybuty skojarzone z odpowiednim elementem w tablicy args . Skojarzone atrybuty parametru są przechowywane w podpisie członka.

Domyślny binder przetwarza ten parametr tylko podczas wywoływania składnika COM.

culture
CultureInfo

CultureInfo Obiekt reprezentujący ustawienia regionalne globalizacji do użycia, które mogą być konieczne w przypadku konwersji specyficznych dla ustawień regionalnych, takich jak konwertowanie ciągu liczbowego na wartość Podwójna.

-lub-

Odwołanie o wartości null (Nothing w Visual Basic) do używania bieżącego wątku CultureInfo.

namedParameters
String[]

Tablica zawierająca nazwy parametrów, do których przekazywane są wartości w tablicy args .

Zwraca

Obiekt reprezentujący zwracaną wartość wywoływanego elementu członkowskiego.

Implementuje

Wyjątki

invokeAttr nie zawiera CreateInstance i name ma wartość null.

args i modifiers nie mają tej samej długości.

-lub-

invokeAttr nie jest prawidłowym BindingFlags atrybutem.

-lub-

invokeAttrnie zawiera jednej z następujących flag powiązania: InvokeMethod, , CreateInstanceGetField, SetField, GetPropertylub SetProperty.

-lub-

invokeAttr zawiera w CreateInstance połączeniu z InvokeMethod, , GetField, SetField, GetPropertylub SetProperty.

-lub-

invokeAttr zawiera zarówno , jak GetField i SetField.

-lub-

invokeAttr zawiera zarówno , jak GetProperty i SetProperty.

-lub-

invokeAttr zawiera InvokeMethod w połączeniu z parametrem SetField lub SetProperty.

-lub-

invokeAttr zawiera SetField i args ma więcej niż jeden element.

-lub-

Nazwana tablica parametrów jest większa niż tablica argumentów.

-lub-

Ta metoda jest wywoływana w obiekcie COM i jedna z następujących flag powiązania nie została przekazana w: BindingFlags.InvokeMethod, , BindingFlags.GetPropertyBindingFlags.SetProperty, , BindingFlags.PutDispPropertylub BindingFlags.PutRefDispProperty.

-lub-

Jedna z nazwanych tablic parametrów zawiera ciąg o nazwie null.

Określony element członkowski jest inicjatorem klasy.

Nie można odnaleźć pola lub właściwości.

Nie można odnaleźć metody zgodnej z argumentami w elemecie args.

-lub-

Nie można odnaleźć elementu członkowskiego z nazwami argumentów podanymi w elemencie namedParameters.

-lub-

Bieżący Type obiekt reprezentuje typ, który zawiera parametry typu otwartego, czyli ContainsGenericParameters zwraca wartość true.

Nie można wywołać określonego elementu członkowskiego w elemencie target.

Więcej niż jedna metoda jest zgodna z kryteriami powiązania.

Metoda reprezentowana przez name element ma co najmniej jeden nieokreślony parametr typu ogólnego. Oznacza to, że właściwość metody ContainsGenericParameters zwraca truewartość .

Uwagi

InvokeMember wywołuje składową konstruktora lub składową metody, pobiera lub ustawia element członkowski właściwości, pobiera lub ustawia element elementu członkowskiego pola danych albo pobiera lub ustawia element składowej tablicy.

Uwaga

Nie można InvokeMember wywołać metody ogólnej.

Po wywołaniu IDispatch elementu członkowskiego można określić identyfikator DispID zamiast nazwy elementu członkowskiego, używając formatu ciągu "[DispID=##]". Jeśli na przykład identyfikator DispID elementu MyComMethod ma wartość 3, możesz określić ciąg "[DispID=3]" zamiast "MyComMethod". Wywołanie elementu członkowskiego przez dispID jest szybsze niż wyszukanie elementu członkowskiego według nazwy. W złożonych scenariuszach agregacji identyfikator DispID jest czasami jedynym sposobem wywoływania żądanego elementu członkowskiego.

Mimo że domyślny binder nie przetwarza ParameterModifier lub CultureInfo (parametry modifiers i culture ), można użyć klasy abstrakcyjnej System.Reflection.Binder do zapisania niestandardowego powiązania, który przetwarza modifiers i culture. ParameterModifier jest używany tylko podczas wywoływania międzyoperacyjności MODELU COM, a obsługiwane są tylko parametry przekazywane przez odwołanie.

Każdy parametr w tablicy namedParameters pobiera wartość w odpowiednim elemecie w tablicy args . Jeśli długość parametru args jest większa niż długość , pozostałe wartości argumentów namedParameterssą przekazywane w kolejności.

Tablica namedParameters może służyć do zmiany kolejności argumentów w tablicy wejściowej. Na przykład, biorąc pod uwagę metodę M(string a, int b) (M(ByVal a As String, ByVal b As Integer) w Visual Basic) i tablicę { 42, "x" }wejściową , tablica wejściowa może zostać przekazana bez zmian, args jeśli tablica { "b", "a" } jest dostarczana dla namedParameters.

Następujące BindingFlags flagi filtru mogą służyć do definiowania elementów członkowskich do uwzględnienia w wyszukiwaniu:

  • Określ BindingFlags.Public , aby uwzględnić członków publicznych w wyszukiwaniu.

  • Określ BindingFlags.NonPublic , aby uwzględnić niepublizowanych członków (czyli prywatnych, wewnętrznych i chronionych) w wyszukiwaniu.

  • Określ BindingFlags.FlattenHierarchy , aby uwzględnić statyczne elementy członkowskie w hierarchii.

Następujące BindingFlags flagi modyfikatora mogą służyć do zmiany sposobu działania wyszukiwania:

  • BindingFlags.IgnoreCaseaby zignorować przypadek .name

  • BindingFlags.DeclaredOnly aby przeszukać tylko elementy członkowskie zadeklarowane w obiekcie Type, a nie na elementach członkowskich, które zostały po prostu odziedziczone.

BindingFlags Następujące flagi wywołania mogą służyć do określenia akcji, która ma zostać zastosowana do elementu członkowskiego:

  • CreateInstance aby wywołać konstruktor. Parametr name jest ignorowany. Nieprawidłowa z innymi flagami wywołania.

  • InvokeMethod wywołać metodę, ale nie konstruktora lub inicjatora typu. Nieprawidłowa wartość z ciągiem SetField lub SetProperty. Jeśli InvokeMethod jest określony przez siebie, BindingFlags.Public, BindingFlags.Instancei BindingFlags.Static są automatycznie dołączane.

  • GetField aby uzyskać wartość pola. Nieprawidłowa wartość w pliku SetField.

  • SetField aby ustawić wartość pola. Nieprawidłowa wartość w pliku GetField.

  • GetProperty aby uzyskać właściwość. Nieprawidłowa wartość w pliku SetProperty.

  • SetProperty aby ustawić właściwość. Nieprawidłowa wartość w pliku GetProperty.

Aby uzyskać więcej informacji, zobacz System.Reflection.BindingFlags.

Metoda zostanie wywołana, jeśli oba następujące warunki są spełnione:

  • Liczba parametrów w deklaracji metody jest równa liczbie argumentów w args tablicy (chyba że argumenty domyślne są zdefiniowane w elemencie członkowskim i BindingFlags.OptionalParamBinding jest określony).

  • Typ każdego argumentu można przekonwertować przez binder na typ parametru.

Binder znajdzie wszystkie pasujące metody. Te metody można znaleźć na podstawie typu żądanego powiązania (BindingFlags wartości InvokeMethod, GetPropertyitd.). Zestaw metod jest filtrowany według nazwy, liczby argumentów i zestawu modyfikatorów wyszukiwania zdefiniowanych w binderze.

Po wybraniu metody jest wywoływana. Dostępność jest sprawdzana w tym momencie. Wyszukiwanie może kontrolować, który zestaw metod jest wyszukiwany na podstawie atrybutu ułatwień dostępu skojarzonego z metodą. Metoda Binder.BindToMethodBinder klasy jest odpowiedzialna za wybranie metody do wywołania. Domyślny binder wybiera najbardziej specyficzne dopasowanie.

InvokeMember może służyć do wywoływania metod z parametrami, które mają wartości domyślne. Aby powiązać z tymi metodami, należy BindingFlags.OptionalParamBinding określić odbicie. W przypadku parametru, który ma wartość domyślną, możesz podać inną wartość lub podać wartość Missing.Value domyślną.

Rozważmy na przykład metodę, taką jak MyMethod(int x, float y = 2.0). Aby wywołać tę metodę tylko z pierwszym argumentem jako MyMethod(4), przekaż jedną z powyższych flag powiązania i przekaż dwa argumenty, a mianowicie 4 dla pierwszego argumentu i Missing.Value drugiego argumentu. Jeśli nie używasz metody Missing.Value, nie można pominąć parametrów opcjonalnych za pomocą Invoke metody . Jeśli musisz to zrobić, użyj InvokeMember zamiast tego.

Ograniczenia dostępu są ignorowane dla w pełni zaufanego kodu; to znaczy, prywatne konstruktory, metody, pola i właściwości mogą być dostępne i wywoływane za pośrednictwem System.Reflection każdego, gdy kod jest w pełni zaufany.

Możesz użyć Type.InvokeMember polecenia , aby ustawić pole na określoną wartość, określając BindingFlags.SetFieldwartość . Jeśli na przykład chcesz ustawić pole wystąpienia publicznego o nazwie F w klasie C, a F to String, możesz użyć kodu, takiego jak:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"}, null, null, null);

Jeśli język F to String[], możesz użyć kodu, takiego jak:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}}, null, null, null);

które zainicjuje pole F do tej nowej tablicy. Można również użyć Type.InvokeMember polecenia , aby ustawić pozycję w tablicy, podając indeks wartości, a następnie następną wartość przy użyciu kodu, takiego jak:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"}, null, null, null);

Spowoduje to zmianę ciągu "z" w tablicy, która zawiera ciąg "b".

Uwaga

Począwszy od .NET Framework 2.0 z dodatkiem Service Pack 1, ta metoda może służyć do uzyskiwania dostępu do niepublizowanych elementów członkowskich, jeśli obiekt wywołujący otrzymał ReflectionPermissionReflectionPermissionFlag.RestrictedMemberAccess flagę, a zestaw dotacji niepublizowanych członków jest ograniczony do zestawu dotacji osoby wywołującej lub jego podzbioru. (Zobacz Zagadnienia dotyczące zabezpieczeń do odbicia).

Aby korzystać z tej funkcji, aplikacja powinna być docelowa dla .NET Framework 3.5 lub nowszej.

Zobacz też

Dotyczy