DynamicObject.TryInvoke(InvokeBinder, Object[], Object) Metode
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Menyediakan implementasi untuk operasi yang memanggil objek. Kelas yang berasal dari DynamicObject kelas dapat mengambil alih metode ini untuk menentukan perilaku dinamis untuk operasi seperti memanggil objek atau delegasi.
public:
virtual bool TryInvoke(System::Dynamic::InvokeBinder ^ binder, cli::array <System::Object ^> ^ args, [Runtime::InteropServices::Out] System::Object ^ % result);
public virtual bool TryInvoke (System.Dynamic.InvokeBinder binder, object[] args, out object result);
public virtual bool TryInvoke (System.Dynamic.InvokeBinder binder, object?[]? args, out object? result);
abstract member TryInvoke : System.Dynamic.InvokeBinder * obj[] * obj -> bool
override this.TryInvoke : System.Dynamic.InvokeBinder * obj[] * obj -> bool
Public Overridable Function TryInvoke (binder As InvokeBinder, args As Object(), ByRef result As Object) As Boolean
Parameter
- binder
- InvokeBinder
Menyediakan informasi tentang operasi pemanggilan.
- args
- Object[]
Argumen yang diteruskan ke objek selama operasi pemanggilan. Misalnya, untuk sampleObject(100)
operasi, di mana sampleObject
berasal dari DynamicObject kelas , args[0]
sama dengan 100.
- result
- Object
Hasil dari pemanggilan objek.
Mengembalikan
true
jika operasi berhasil; jika tidak, false
. Jika metode ini mengembalikan false
, pengikat run-time bahasa menentukan perilaku. (Dalam kebanyakan kasus, pengecualian run-time khusus bahasa dilemparkan.
Contoh
Asumsikan bahwa Anda memerlukan struktur data untuk menyimpan representasi tekstual dan numerik angka. Anda ingin dapat menentukan nilai untuk setiap properti satu per satu dan juga dapat menginisialisasi semua properti dalam satu pernyataan.
Contoh kode berikut menunjukkan DynamicNumber
kelas , yang berasal dari DynamicObject kelas . DynamicNumber
mengambil TryInvoke alih metode untuk mengaktifkan inisialisasi semua properti pada satu waktu. Ini juga mengambil alih TrySetMember metode dan TryGetMember untuk memungkinkan akses ke properti objek individual.
// The class derived from DynamicObject.
public class DynamicNumber : DynamicObject
{
// The inner dictionary to store field names and values.
Dictionary<string, object> dictionary
= new Dictionary<string, object>();
// Get the property value.
public override bool TryGetMember(
GetMemberBinder binder, out object result)
{
return dictionary.TryGetValue(binder.Name, out result);
}
// Set the property value.
public override bool TrySetMember(
SetMemberBinder binder, object value)
{
dictionary[binder.Name] = value;
return true;
}
// Initializing properties with arguments' values.
public override bool TryInvoke(
InvokeBinder binder, object[] args, out object result)
{
// The invoke operation in this case takes two arguments.
// The first one is integer and the second one is string.
if ((args.Length == 2) &&
(args[0].GetType() == typeof(int)) &&
(args[1].GetType() == typeof(String)))
{
// If the property already exists,
// its value is changed.
// Otherwise, a new property is created.
if (dictionary.ContainsKey("Numeric"))
dictionary["Numeric"] = args[0];
else
dictionary.Add("Numeric", args[0]);
if (dictionary.ContainsKey("Textual"))
dictionary["Textual"] = args[1];
else
dictionary.Add("Textual", args[1]);
result = true;
return true;
}
else
{
// If the number of arguments is wrong,
// or if arguments are of the wrong type,
// the method returns false.
result = false;
return false;
}
}
}
class Program
{
static void Test(string[] args)
{
// Creating a dynamic object.
dynamic number = new DynamicNumber();
// Adding and initializing properties.
// The TrySetMember method is called.
number.Numeric = 1;
number.Textual = "One";
// Printing out the result.
// The TryGetMember method is called.
Console.WriteLine(number.Numeric + " " + number.Textual);
// Invoking an object.
// The TryInvoke method is called.
number(2, "Two");
Console.WriteLine(number.Numeric + " " + number.Textual);
// The following statement produces a run-time exception
// because in this example the method invocation
// expects two arguments.
// number(0);
}
}
// This code example produces the following output:
// 1 One
// 2 Two
Keterangan
Kelas yang berasal dari DynamicObject kelas dapat mengambil alih metode ini untuk menentukan bagaimana operasi yang memanggil objek harus dilakukan untuk objek dinamis. Ketika metode tidak ditimpa, pengikat run-time bahasa menentukan perilaku. (Dalam kebanyakan kasus, pengecualian run-time dilemparkan.)
Jika metode ini ditimpa, metode ini secara otomatis dipanggil ketika Anda memiliki operasi seperti sampleObject(100)
, di mana sampleObject
berasal dari DynamicObject kelas .
Operasi untuk memanggil objek didukung di C# tetapi tidak di Visual Basic. Pengkompilasi Visual Basic tidak pernah memancarkan kode untuk menggunakan metode ini, dan bahasa Visual Basic tidak mendukung sintaks seperti sampleObject(100)
.