Type.InvokeMember Metode

Definisi

Memanggil anggota tertentu dari saat ini Type.

Overload

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

Memanggil anggota yang ditentukan, menggunakan batasan pengikatan yang ditentukan dan cocok dengan daftar argumen yang ditentukan.

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

Memanggil anggota yang ditentukan, menggunakan batasan pengikatan yang ditentukan dan mencocokkan daftar argumen dan budaya yang ditentukan.

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

Saat ditimpa di kelas turunan, memanggil anggota yang ditentukan, menggunakan batasan pengikatan yang ditentukan dan mencocokkan daftar argumen, pengubah, dan budaya yang ditentukan.

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

Sumber:
Type.cs
Sumber:
Type.cs
Sumber:
Type.cs

Memanggil anggota yang ditentukan, menggunakan batasan pengikatan yang ditentukan dan cocok dengan daftar argumen yang ditentukan.

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

Parameter

name
String

String yang berisi nama konstruktor, metode, properti, atau anggota bidang untuk dipanggil.

-atau-

String kosong ("") untuk memanggil anggota default.

-atau-

Untuk IDispatch anggota, string yang mewakili DispID, misalnya "[DispID=3]".

invokeAttr
BindingFlags

Kombinasi bitwise dari nilai enumerasi yang menentukan bagaimana pencarian dilakukan. Aksesnya bisa menjadi salah BindingFlags satu dari seperti , , NonPublic, PrivateInvokeMethod, GetField, dan sebagainyaPublic. Tipe pencarian tidak perlu ditentukan. Jika jenis pencarian dihilangkan, BindingFlags.Public | | BindingFlags.InstanceBindingFlags.Static digunakan.

binder
Binder

Objek yang mendefinisikan sekumpulan properti dan memungkinkan pengikatan, yang dapat melibatkan pemilihan metode yang kelebihan beban, paksaan jenis argumen, dan pemanggilan anggota melalui refleksi.

-atau-

Referensi null (Nothing di Visual Basic), untuk menggunakan DefaultBinder. Perhatikan bahwa secara eksplisit mendefinisikan Binder objek mungkin diperlukan untuk berhasil memanggil metode kelebihan beban dengan argumen variabel.

target
Object

Objek tempat memanggil anggota yang ditentukan.

args
Object[]

Array yang berisi argumen untuk diteruskan ke anggota untuk dipanggil.

Mengembalikan

Objek yang mewakili nilai pengembalian anggota yang dipanggil.

Penerapan

Pengecualian

invokeAttr tidak berisi CreateInstance dan name adalah null.

invokeAttr bukan atribut yang valid BindingFlags .

-atau-

invokeAttrtidak berisi salah satu bendera pengikatan berikut: InvokeMethod, , CreateInstance, GetFieldSetField, GetProperty, atau SetProperty.

-atau-

invokeAttr berisi CreateInstance dikombinasikan dengan InvokeMethod, GetField, SetField, GetProperty, atau SetProperty.

-atau-

invokeAttr berisi dan GetFieldSetField.

-atau-

invokeAttr berisi dan GetPropertySetProperty.

-atau-

invokeAttr berisi InvokeMethod dikombinasikan dengan SetField atau SetProperty.

-atau-

invokeAttr berisi SetField dan args memiliki lebih dari satu elemen.

-atau-

Metode ini dipanggil pada objek COM dan salah satu bendera pengikatan berikut tidak diteruskan di: BindingFlags.InvokeMethod, , BindingFlags.GetProperty, BindingFlags.SetPropertyBindingFlags.PutDispProperty, atau BindingFlags.PutRefDispProperty.

-atau-

Salah satu array parameter bernama berisi string yaitu null.

Anggota yang ditentukan adalah penginisialisasi kelas.

Bidang atau properti tidak dapat ditemukan.

Tidak ada metode yang dapat ditemukan yang cocok dengan argumen di args.

-atau-

Objek saat ini Type mewakili jenis yang berisi parameter jenis terbuka, yaitu, ContainsGenericParameters mengembalikan true.

Anggota yang ditentukan tidak dapat dipanggil pada target.

Lebih dari satu metode cocok dengan kriteria pengikatan.

.NET Compact Framework saat ini tidak mendukung metode ini.

Metode yang diwakili oleh name memiliki satu atau beberapa parameter jenis generik yang tidak ditentukan. Artinya, properti metode ContainsGenericParameters mengembalikan true.

Contoh

Contoh berikut menggunakan InvokeMember untuk mengakses anggota jenis.

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

Keterangan

Catatan

Anda tidak dapat menggunakan InvokeMember untuk memanggil metode generik.

Bendera filter berikut BindingFlags dapat digunakan untuk menentukan anggota mana yang akan disertakan dalam pencarian:

  • Tentukan BindingFlags.Public untuk menyertakan anggota publik dalam pencarian.

  • Tentukan BindingFlags.NonPublic untuk menyertakan anggota non-publik (yaitu, anggota privat dan terproteksi) dalam pencarian.

  • Tentukan BindingFlags.FlattenHierarchy untuk menyertakan anggota statis ke hierarki.

Bendera pengubah berikut BindingFlags dapat digunakan untuk mengubah cara kerja pencarian:

  • BindingFlags.IgnoreCase untuk mengabaikan kasus name.

  • BindingFlags.DeclaredOnly untuk mencari hanya anggota yang dideklarasikan pada Type, bukan anggota yang hanya diwarisi.

Bendera pemanggilan berikut BindingFlags dapat digunakan untuk menunjukkan tindakan apa yang harus diambil dengan anggota:

  • CreateInstance untuk memanggil konstruktor. name diabaikan. Tidak valid dengan bendera pemanggilan lainnya.

  • InvokeMethod untuk memanggil metode, tetapi bukan konstruktor atau penginisialisasi jenis. Tidak valid dengan SetField atau SetProperty. Jika InvokeMethod ditentukan dengan sendirinya, BindingFlags.Public, BindingFlags.Instance, dan BindingFlags.Static secara otomatis disertakan.

  • GetField untuk mendapatkan nilai bidang. Tidak valid dengan SetField.

  • SetField untuk mengatur nilai bidang. Tidak valid dengan GetField.

  • GetProperty untuk mendapatkan properti. Tidak valid dengan SetProperty.

  • SetProperty untuk mengatur properti. Tidak valid dengan GetProperty.

Lihat System.Reflection.BindingFlags untuk informasi lebih lanjut.

Metode akan dipanggil jika kedua kondisi berikut ini benar:

  • Jumlah parameter dalam deklarasi metode sama dengan jumlah argumen dalam args array (kecuali argumen default ditentukan pada anggota dan BindingFlags.OptionalParamBinding ditentukan).

  • Jenis setiap argumen dapat dikonversi oleh pengikat ke jenis parameter.

Pengikat akan menemukan semua metode yang cocok. Metode ini ditemukan berdasarkan jenis pengikatan yang diminta (BindingFlags nilai InvokeMethod, , GetPropertydan sebagainya). Kumpulan metode difilter berdasarkan nama, jumlah argumen, dan sekumpulan pengubah pencarian yang ditentukan dalam pengikat.

Setelah metode dipilih, metode dipanggil. Aksesibilitas diperiksa pada saat itu. Pencarian dapat mengontrol set metode mana yang dicari berdasarkan atribut aksesibilitas yang terkait dengan metode . Metode Binder.BindToMethodBinder kelas bertanggung jawab untuk memilih metode yang akan dipanggil. Pengikat default memilih kecocokan yang paling spesifik.

Pembatasan akses diabaikan untuk kode yang sepenuhnya tepercaya; artinya, konstruktor privat, metode, bidang, dan properti dapat diakses dan dipanggil setiap System.Reflection kali kode sepenuhnya dipercaya.

Anda bisa menggunakan Type.InvokeMember untuk mengatur bidang ke nilai tertentu dengan menentukan BindingFlags.SetField. Misalnya, jika Anda ingin mengatur bidang instans publik bernama F pada kelas C, dan F adalah String, Anda dapat menggunakan kode seperti:

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

Jika F adalah String[], Anda dapat menggunakan kode seperti:

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

yang akan menginisialisasi bidang F ke array baru ini. Anda juga dapat menggunakan Type.InvokeMember untuk mengatur posisi dalam array dengan menyediakan indeks nilai lalu nilai berikutnya dengan menggunakan kode seperti berikut:

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

Ini akan mengubah string "z" dalam array yang dipegang F ke string "b".

Saat memanggil IDispatch anggota, Anda dapat menentukan DispID alih-alih nama anggota, menggunakan format string "[DispID=##]". Misalnya, jika DispID myComMethod adalah 3, Anda dapat menentukan string "[DispID=3]" alih-alih "MyComMethod". Memanggil anggota oleh DispID lebih cepat daripada mencari anggota berdasarkan nama. Dalam skenario agregasi yang kompleks, DispID terkadang merupakan satu-satunya cara untuk memanggil anggota yang diinginkan.

Catatan

Dimulai dengan .NET Framework 2.0 Paket Layanan 1, metode ini dapat digunakan untuk mengakses anggota non-publik jika penelepon telah diberikan ReflectionPermission dengan ReflectionPermissionFlag.RestrictedMemberAccess bendera dan jika sekumpulan pemberian anggota non-publik dibatasi untuk set pemberian penelepon, atau subsetnya. (Lihat Pertimbangan Keamanan untuk Refleksi.)

Untuk menggunakan fungsionalitas ini, aplikasi Anda harus menargetkan .NET Framework 3.5 atau yang lebih baru.

Lihat juga

Berlaku untuk

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

Sumber:
Type.cs
Sumber:
Type.cs
Sumber:
Type.cs

Memanggil anggota yang ditentukan, menggunakan batasan pengikatan yang ditentukan dan mencocokkan daftar argumen dan budaya yang ditentukan.

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

Parameter

name
String

String yang berisi nama konstruktor, metode, properti, atau anggota bidang untuk dipanggil.

-atau-

String kosong ("") untuk memanggil anggota default.

-atau-

Untuk IDispatch anggota, string yang mewakili DispID, misalnya "[DispID=3]".

invokeAttr
BindingFlags

Kombinasi bitwise dari nilai enumerasi yang menentukan bagaimana pencarian dilakukan. Aksesnya bisa menjadi salah BindingFlags satu dari seperti , , NonPublic, PrivateInvokeMethod, GetField, dan sebagainyaPublic. Tipe pencarian tidak perlu ditentukan. Jika jenis pencarian dihilangkan, BindingFlags.Public | | BindingFlags.InstanceBindingFlags.Static digunakan.

binder
Binder

Objek yang mendefinisikan sekumpulan properti dan memungkinkan pengikatan, yang dapat melibatkan pemilihan metode yang kelebihan beban, paksaan jenis argumen, dan pemanggilan anggota melalui refleksi.

-atau-

Referensi null (Nothing di Visual Basic), untuk menggunakan DefaultBinder. Perhatikan bahwa secara eksplisit mendefinisikan Binder objek mungkin diperlukan untuk berhasil memanggil metode kelebihan beban dengan argumen variabel.

target
Object

Objek tempat memanggil anggota yang ditentukan.

args
Object[]

Array yang berisi argumen untuk diteruskan ke anggota untuk dipanggil.

culture
CultureInfo

Objek yang mewakili lokal globalisasi untuk digunakan, yang mungkin diperlukan untuk konversi khusus lokal, seperti mengonversi numerik String menjadi Double.

-atau-

Referensi null (Nothing di Visual Basic) untuk menggunakan utas CultureInfosaat ini.

Mengembalikan

Objek yang mewakili nilai pengembalian anggota yang dipanggil.

Penerapan

Pengecualian

invokeAttr tidak berisi CreateInstance dan name adalah null.

invokeAttr bukan atribut yang valid BindingFlags .

-atau-

invokeAttrtidak berisi salah satu bendera pengikatan berikut: InvokeMethod, , CreateInstance, GetFieldSetField, GetProperty, atau SetProperty.

-atau-

invokeAttr berisi CreateInstance dikombinasikan dengan InvokeMethod, GetField, SetField, GetProperty, atau SetProperty.

-atau-

invokeAttr berisi dan GetFieldSetField.

-atau-

invokeAttr berisi dan GetPropertySetProperty.

-atau-

invokeAttr berisi InvokeMethod dikombinasikan dengan SetField atau SetProperty.

-atau-

invokeAttr berisi SetField dan args memiliki lebih dari satu elemen.

-atau-

Metode ini dipanggil pada objek COM dan salah satu bendera pengikatan berikut tidak diteruskan di: BindingFlags.InvokeMethod, , BindingFlags.GetProperty, BindingFlags.SetPropertyBindingFlags.PutDispProperty, atau BindingFlags.PutRefDispProperty.

-atau-

Salah satu array parameter bernama berisi string yaitu null.

Anggota yang ditentukan adalah penginisialisasi kelas.

Bidang atau properti tidak dapat ditemukan.

Tidak ada metode yang dapat ditemukan yang cocok dengan argumen di args.

-atau-

Objek saat ini Type mewakili jenis yang berisi parameter jenis terbuka, yaitu, ContainsGenericParameters mengembalikan true.

Anggota yang ditentukan tidak dapat dipanggil pada target.

Lebih dari satu metode cocok dengan kriteria pengikatan.

Metode yang diwakili oleh name memiliki satu atau beberapa parameter jenis generik yang tidak ditentukan. Artinya, properti metode ContainsGenericParameters mengembalikan true.

Keterangan

Meskipun pengikat default tidak memproses CultureInfo ( culture parameter ), Anda dapat menggunakan kelas abstrak System.Reflection.Binder untuk menulis pengikat kustom yang memproses culture.

Catatan

Anda tidak dapat menggunakan InvokeMember untuk memanggil metode generik.

Bendera filter berikut BindingFlags dapat digunakan untuk menentukan anggota mana yang akan disertakan dalam pencarian:

  • Tentukan BindingFlags.Public untuk menyertakan anggota publik dalam pencarian.

  • Tentukan BindingFlags.NonPublic untuk menyertakan anggota non-publik (yaitu, privat, internal, dan anggota yang dilindungi) dalam pencarian.

  • Tentukan BindingFlags.FlattenHierarchy untuk menyertakan anggota statis ke hierarki.

Bendera pengubah berikut BindingFlags dapat digunakan untuk mengubah cara kerja pencarian:

  • BindingFlags.IgnoreCase untuk mengabaikan kasus name.

  • BindingFlags.DeclaredOnly untuk mencari hanya anggota yang dideklarasikan pada Type, bukan anggota yang hanya diwarisi.

Bendera pemanggilan berikut BindingFlags dapat digunakan untuk menunjukkan tindakan apa yang harus diambil dengan anggota:

  • CreateInstance untuk memanggil konstruktor. name diabaikan. Tidak valid dengan bendera pemanggilan lainnya.

  • InvokeMethod untuk memanggil metode, tetapi bukan konstruktor atau penginisialisasi jenis. Tidak valid dengan SetField atau SetProperty. Jika InvokeMethod ditentukan dengan sendirinya, BindingFlags.Public, BindingFlags.Instance, dan BindingFlags.Static secara otomatis disertakan.

  • GetField untuk mendapatkan nilai bidang. Tidak valid dengan SetField.

  • SetField untuk mengatur nilai bidang. Tidak valid dengan GetField.

  • GetProperty untuk mendapatkan properti. Tidak valid dengan SetProperty.

  • SetProperty untuk mengatur properti. Tidak valid dengan GetProperty.

Lihat System.Reflection.BindingFlags untuk informasi lebih lanjut.

Metode akan dipanggil jika kedua kondisi berikut ini benar:

  • Jumlah parameter dalam deklarasi metode sama dengan jumlah argumen dalam args array (kecuali argumen default ditentukan pada anggota dan BindingFlags.OptionalParamBinding ditentukan).

  • Jenis setiap argumen dapat dikonversi oleh pengikat ke jenis parameter.

Pengikat akan menemukan semua metode yang cocok. Metode ini ditemukan berdasarkan jenis pengikatan yang diminta (BindingFlags nilai InvokeMethod, , GetPropertydan sebagainya). Kumpulan metode difilter berdasarkan nama, jumlah argumen, dan sekumpulan pengubah pencarian yang ditentukan dalam pengikat.

Setelah metode dipilih, metode dipanggil. Aksesibilitas diperiksa pada saat itu. Pencarian dapat mengontrol set metode mana yang dicari berdasarkan atribut aksesibilitas yang terkait dengan metode . Metode Binder.BindToMethodBinder kelas bertanggung jawab untuk memilih metode yang akan dipanggil. Pengikat default memilih kecocokan yang paling spesifik.

Pembatasan akses diabaikan untuk kode yang sepenuhnya tepercaya; artinya, konstruktor privat, metode, bidang, dan properti dapat diakses dan dipanggil melalui Pantulan setiap kali kode sepenuhnya dipercaya.

Anda bisa menggunakan Type.InvokeMember untuk mengatur bidang ke nilai tertentu dengan menentukan BindingFlags.SetField. Misalnya, jika Anda ingin mengatur bidang instans publik bernama F pada kelas C, dan F adalah kode yang String dapat Anda gunakan seperti:

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

Jika F adalah String[], Anda dapat menggunakan kode seperti:

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

yang akan menginisialisasi bidang F ke array baru ini. Anda juga dapat menggunakan Type.InvokeMember untuk mengatur posisi dalam array dengan menyediakan indeks nilai lalu nilai berikutnya dengan menggunakan kode seperti berikut:

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

Ini akan mengubah string "z" dalam array yang dipegang F ke string "b".

Saat memanggil IDispatch anggota, Anda dapat menentukan DispID alih-alih nama anggota, menggunakan format string "[DispID=##]". Misalnya, jika DispID myComMethod adalah 3, Anda dapat menentukan string "[DispID=3]" alih-alih "MyComMethod". Memanggil anggota oleh DispID lebih cepat daripada mencari anggota berdasarkan nama. Dalam skenario agregasi yang kompleks, DispID terkadang merupakan satu-satunya cara untuk memanggil anggota yang diinginkan.

Catatan

Dimulai dengan .NET Framework 2.0 Service Pack 1, metode ini dapat digunakan untuk mengakses anggota non-publik jika penelepon telah diberikan ReflectionPermission dengan ReflectionPermissionFlag.RestrictedMemberAccess bendera dan jika set pemberian anggota non-publik dibatasi untuk set pemberian penelepon, atau subsetnya. (Lihat Pertimbangan Keamanan untuk Refleksi.)

Untuk menggunakan fungsionalitas ini, aplikasi Anda harus menargetkan .NET Framework 3.5 atau yang lebih baru.

Lihat juga

Berlaku untuk

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

Sumber:
Type.cs
Sumber:
Type.cs
Sumber:
Type.cs

Saat ditimpa di kelas turunan, memanggil anggota yang ditentukan, menggunakan batasan pengikatan yang ditentukan dan mencocokkan daftar argumen, pengubah, dan budaya yang ditentukan.

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

Parameter

name
String

String yang berisi nama konstruktor, metode, properti, atau anggota bidang yang akan dipanggil.

-atau-

String kosong ("") untuk memanggil anggota default.

-atau-

Untuk IDispatch anggota, string yang mewakili DispID, misalnya "[DispID=3]".

invokeAttr
BindingFlags

Kombinasi bitwise dari nilai enumerasi yang menentukan bagaimana pencarian dilakukan. Aksesnya bisa menjadi salah BindingFlags satu seperti Public, , NonPublic, PrivateInvokeMethod, GetField, dan sebagainya. Tipe pencarian tidak perlu ditentukan. Jika jenis pencarian dihilangkan, BindingFlags.Public | | BindingFlags.InstanceBindingFlags.Static digunakan.

binder
Binder

Objek yang menentukan sekumpulan properti dan memungkinkan pengikatan, yang dapat melibatkan pemilihan metode yang kelebihan beban, pemaksaan jenis argumen, dan pemanggilan anggota melalui refleksi.

-atau-

Referensi null (Tidak ada di Visual Basic), untuk menggunakan DefaultBinder. Perhatikan bahwa secara eksplisit mendefinisikan Binder objek mungkin diperlukan untuk berhasil memanggil metode kelebihan beban dengan argumen variabel.

target
Object

Objek untuk memanggil anggota yang ditentukan.

args
Object[]

Array yang berisi argumen untuk diteruskan ke anggota untuk dipanggil.

modifiers
ParameterModifier[]

Array ParameterModifier objek yang mewakili atribut yang terkait dengan elemen yang sesuai dalam args array. Atribut terkait parameter disimpan dalam tanda tangan anggota.

Pengikat default memproses parameter ini hanya saat memanggil komponen COM.

culture
CultureInfo

Objek CultureInfo yang mewakili lokal globalisasi untuk digunakan, yang mungkin diperlukan untuk konversi khusus lokal, seperti mengonversi String numerik menjadi Ganda.

-atau-

Referensi null (Nothing di Visual Basic) untuk menggunakan utas CultureInfosaat ini.

namedParameters
String[]

Array yang berisi nama parameter tempat nilai dalam args array diteruskan.

Mengembalikan

Objek yang mewakili nilai pengembalian anggota yang dipanggil.

Penerapan

Pengecualian

invokeAttr tidak berisi CreateInstance dan name adalah null.

args dan modifiers tidak memiliki panjang yang sama.

-atau-

invokeAttr bukan atribut yang valid BindingFlags .

-atau-

invokeAttrtidak berisi salah satu bendera pengikatan berikut: InvokeMethod, , CreateInstance, GetFieldSetField, GetProperty, atau SetProperty.

-atau-

invokeAttr berisi CreateInstance dikombinasikan dengan InvokeMethod, GetField, SetField, GetProperty, atau SetProperty.

-atau-

invokeAttr berisi dan GetFieldSetField.

-atau-

invokeAttr berisi dan GetPropertySetProperty.

-atau-

invokeAttr berisi InvokeMethod dikombinasikan dengan SetField atau SetProperty.

-atau-

invokeAttr berisi SetField dan args memiliki lebih dari satu elemen.

-atau-

Array parameter bernama lebih besar dari array argumen.

-atau-

Metode ini dipanggil pada objek COM dan salah satu bendera pengikatan berikut tidak diteruskan dalam: BindingFlags.InvokeMethod, , BindingFlags.GetProperty, BindingFlags.SetPropertyBindingFlags.PutDispProperty, atau BindingFlags.PutRefDispProperty.

-atau-

Salah satu array parameter bernama berisi string yaitu null.

Anggota yang ditentukan adalah penginisialisasi kelas.

Bidang atau properti tidak dapat ditemukan.

Tidak ada metode yang dapat ditemukan yang cocok dengan argumen di args.

-atau-

Tidak ada anggota yang dapat ditemukan yang memiliki nama argumen yang disediakan dalam namedParameters.

-atau-

Objek saat ini Type mewakili jenis yang berisi parameter jenis terbuka, yaitu, ContainsGenericParameters mengembalikan true.

Anggota yang ditentukan tidak dapat dipanggil pada target.

Lebih dari satu metode cocok dengan kriteria pengikatan.

Metode yang diwakili oleh name memiliki satu atau beberapa parameter jenis generik yang tidak ditentukan. Artinya, properti metode ContainsGenericParameters mengembalikan true.

Keterangan

InvokeMember memanggil anggota konstruktor atau anggota metode, mendapatkan atau menetapkan anggota properti, mendapatkan atau mengatur anggota bidang data, atau mendapatkan atau menetapkan elemen anggota array.

Catatan

Anda tidak dapat menggunakan InvokeMember untuk memanggil metode generik.

Saat memanggil IDispatch anggota, Anda dapat menentukan DispID alih-alih nama anggota, menggunakan format string "[DispID=##]". Misalnya, jika DispID MyComMethod adalah 3, Anda dapat menentukan string "[DispID=3]" alih-alih "MyComMethod". Memanggil anggota oleh DispID lebih cepat daripada mencari anggota berdasarkan nama. Dalam skenario agregasi yang kompleks, DispID terkadang merupakan satu-satunya cara untuk memanggil anggota yang diinginkan.

Meskipun pengikat default tidak memproses atau (parameter dan culture ), Anda dapat menggunakan kelas abstrak System.Reflection.Binder untuk menulis pengikat kustom yang memproses modifiers dan culture.modifiersCultureInfoParameterModifier ParameterModifier hanya digunakan saat memanggil melalui interop COM, dan hanya parameter yang diteruskan oleh referensi yang ditangani.

Setiap parameter dalam namedParameters array mendapatkan nilai dalam elemen yang sesuai dalam args array. Jika panjang args lebih besar dari panjang namedParameters, nilai argumen yang tersisa diteruskan secara berurutan.

Array namedParameters dapat digunakan untuk mengubah urutan argumen dalam array input. Misalnya, mengingat metode M(string a, int b) (M(ByVal a As String, ByVal b As Integer) dalam Visual Basic) dan array { 42, "x" }input , array input dapat diteruskan args tidak berubah jika array { "b", "a" } disediakan untuk namedParameters.

Bendera filter berikut BindingFlags dapat digunakan untuk menentukan anggota mana yang akan disertakan dalam pencarian:

  • Tentukan BindingFlags.Public untuk menyertakan anggota publik dalam pencarian.

  • Tentukan BindingFlags.NonPublic untuk menyertakan anggota non-publik (yaitu, privat, internal, dan anggota yang dilindungi) dalam pencarian.

  • Tentukan BindingFlags.FlattenHierarchy untuk menyertakan anggota statis ke hierarki.

Bendera pengubah berikut BindingFlags dapat digunakan untuk mengubah cara kerja pencarian:

  • BindingFlags.IgnoreCase untuk mengabaikan kasus name.

  • BindingFlags.DeclaredOnly untuk mencari hanya anggota yang dinyatakan pada Type, bukan anggota yang hanya diwariskan.

Bendera pemanggilan berikut BindingFlags dapat digunakan untuk menunjukkan tindakan apa yang harus diambil dengan anggota:

  • CreateInstance untuk memanggil konstruktor. name diabaikan. Tidak valid dengan bendera pemanggilan lainnya.

  • InvokeMethod untuk memanggil metode, tetapi bukan konstruktor atau penginisialisasi jenis. Tidak valid dengan SetField atau SetProperty. Jika InvokeMethod ditentukan dengan sendirinya, BindingFlags.Public, BindingFlags.Instance, dan BindingFlags.Static secara otomatis disertakan.

  • GetField untuk mendapatkan nilai bidang. Tidak valid dengan SetField.

  • SetField untuk mengatur nilai bidang. Tidak valid dengan GetField.

  • GetProperty untuk mendapatkan properti. Tidak valid dengan SetProperty.

  • SetProperty untuk mengatur properti. Tidak valid dengan GetProperty.

Lihat System.Reflection.BindingFlags untuk informasi lebih lanjut.

Metode akan dipanggil jika kedua kondisi berikut ini benar:

  • Jumlah parameter dalam deklarasi metode sama dengan jumlah argumen dalam args array (kecuali argumen default ditentukan pada anggota dan BindingFlags.OptionalParamBinding ditentukan).

  • Jenis setiap argumen dapat dikonversi oleh pengikat ke jenis parameter.

Pengikat akan menemukan semua metode yang cocok. Metode ini ditemukan berdasarkan jenis pengikatan yang diminta (BindingFlags nilai InvokeMethod, , GetPropertydan sebagainya). Kumpulan metode difilter berdasarkan nama, jumlah argumen, dan sekumpulan pengubah pencarian yang ditentukan dalam pengikat.

Setelah metode dipilih, metode dipanggil. Aksesibilitas diperiksa pada saat itu. Pencarian dapat mengontrol set metode mana yang dicari berdasarkan atribut aksesibilitas yang terkait dengan metode . Metode Binder.BindToMethodBinder kelas bertanggung jawab untuk memilih metode yang akan dipanggil. Pengikat default memilih kecocokan yang paling spesifik.

InvokeMember dapat digunakan untuk memanggil metode dengan parameter yang memiliki nilai default. Untuk mengikat metode ini, Reflection harus BindingFlags.OptionalParamBinding ditentukan. Untuk parameter yang memiliki nilai default, Anda dapat menyediakan nilai yang berbeda, atau menyediakan Missing.Value untuk menggunakan nilai default.

Misalnya, pertimbangkan metode seperti MyMethod(int x, float y = 2.0). Untuk memanggil metode ini hanya dengan argumen pertama sebagai MyMethod(4), lewati salah satu bendera pengikatan di atas dan lewati dua argumen, yaitu, 4 untuk argumen pertama dan Missing.Value untuk argumen kedua. Kecuali Anda menggunakan Missing.Value, Anda mungkin tidak menghilangkan parameter opsional dengan Invoke metode . Jika Anda harus melakukannya, gunakan InvokeMember sebagai gantinya.

Pembatasan akses diabaikan untuk kode yang sepenuhnya tepercaya; artinya, konstruktor privat, metode, bidang, dan properti dapat diakses dan dipanggil setiap System.Reflection kali kode sepenuhnya dipercaya.

Anda bisa menggunakan Type.InvokeMember untuk mengatur bidang ke nilai tertentu dengan menentukan BindingFlags.SetField. Misalnya, jika Anda ingin mengatur bidang instans publik bernama F pada kelas C, dan F adalah String, Anda dapat menggunakan kode seperti:

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

Jika F adalah String[], Anda dapat menggunakan kode seperti:

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

yang akan menginisialisasi bidang F ke array baru ini. Anda juga dapat menggunakan Type.InvokeMember untuk mengatur posisi dalam array dengan menyediakan indeks nilai lalu nilai berikutnya dengan menggunakan kode seperti berikut:

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

Ini akan mengubah string "z" dalam array yang dipegang F ke string "b".

Catatan

Dimulai dengan .NET Framework 2.0 Paket Layanan 1, metode ini dapat digunakan untuk mengakses anggota non-publik jika penelepon telah diberikan ReflectionPermission dengan ReflectionPermissionFlag.RestrictedMemberAccess bendera dan jika sekumpulan pemberian anggota non-publik dibatasi untuk set pemberian penelepon, atau subsetnya. (Lihat Pertimbangan Keamanan untuk Refleksi.)

Untuk menggunakan fungsionalitas ini, aplikasi Anda harus menargetkan .NET Framework 3.5 atau yang lebih baru.

Lihat juga

Berlaku untuk