Bagikan melalui


DynamicObject.TrySetIndex(SetIndexBinder, Object[], Object) Metode

Definisi

Menyediakan implementasi untuk operasi yang menetapkan nilai menurut indeks. Kelas yang berasal dari DynamicObject kelas dapat mengambil alih metode ini untuk menentukan perilaku dinamis untuk operasi yang mengakses objek dengan indeks tertentu.

public:
 virtual bool TrySetIndex(System::Dynamic::SetIndexBinder ^ binder, cli::array <System::Object ^> ^ indexes, System::Object ^ value);
public virtual bool TrySetIndex (System.Dynamic.SetIndexBinder binder, object[] indexes, object value);
public virtual bool TrySetIndex (System.Dynamic.SetIndexBinder binder, object[] indexes, object? value);
abstract member TrySetIndex : System.Dynamic.SetIndexBinder * obj[] * obj -> bool
override this.TrySetIndex : System.Dynamic.SetIndexBinder * obj[] * obj -> bool
Public Overridable Function TrySetIndex (binder As SetIndexBinder, indexes As Object(), value As Object) As Boolean

Parameter

binder
SetIndexBinder

Menyediakan informasi tentang operasi.

indexes
Object[]

Indeks yang digunakan dalam operasi. Misalnya, untuk sampleObject[3] = 10 operasi di C# (sampleObject(3) = 10 di Visual Basic), di mana sampleObject berasal dari DynamicObject kelas , indexes[0] sama dengan 3.

value
Object

Nilai yang akan diatur ke objek yang memiliki indeks yang ditentukan. Misalnya, untuk sampleObject[3] = 10 operasi di C# (sampleObject(3) = 10 di Visual Basic), di mana sampleObject berasal dari DynamicObject kelas , value sama dengan 10.

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 ingin membuat objek di mana properti dapat diakses baik dengan nama seperti , , dan sebagainyaProperty0, atau menurut indeks, sehingga, misalnya, sampleObject.Property0 setara sampleObject[0] dengan di C# atau sampleObject(0) di Visual Basic. Property1

Contoh kode berikut menunjukkan SampleDynamicObject kelas , yang berasal dari DynamicObject kelas . Kelas SampleDynamicObject berisi objek jenis Dictionary<string, object> (Dictionary(Of String, Object) di Visual Basic) untuk menyimpan pasangan kunci-nilai. SampleDynamicObject mengambil alih TrySetIndex metode dan TryGetIndex untuk mengaktifkan akses menurut indeks. Ini mengambil alih TrySetMember metode dan TryGetMember untuk mengaktifkan akses menurut nama properti.

// The class derived from DynamicObject.
public class SampleDynamicObject : 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;
    }

    // Set the property value by index.
    public override bool TrySetIndex(
        SetIndexBinder binder, object[] indexes, object value)
    {
        int index = (int)indexes[0];

        // If a corresponding property already exists, set the value.
        if (dictionary.ContainsKey("Property" + index))
            dictionary["Property" + index] = value;
        else
            // If a corresponding property does not exist, create it.
            dictionary.Add("Property" + index, value);
        return true;
    }

    // Get the property value by index.
    public override bool TryGetIndex(
        GetIndexBinder binder, object[] indexes, out object result)
    {

        int index = (int)indexes[0];
        return dictionary.TryGetValue("Property" + index, out result);
    }
}

class Program
{
    static void Test(string[] args)
    {
        // Creating a dynamic object.
        dynamic sampleObject = new SampleDynamicObject();

        // Creating Property0.
        // The TrySetMember method is called.
        sampleObject.Property0 = "Zero";

        // Getting the value by index.
        // The TryGetIndex method is called.
        Console.WriteLine(sampleObject[0]);

        // Setting the property value by index.
        // The TrySetIndex method is called.
        // (This method also creates Property1.)
        sampleObject[1] = 1;

        // Getting the Property1 value.
        // The TryGetMember method is called.
        Console.WriteLine(sampleObject.Property1);

        // The following statement produces a run-time exception
        // because there is no corresponding property.
        //Console.WriteLine(sampleObject[2]);
    }
}

// This code example produces the following output:

// Zero
// 1
' The class derived from DynamicObject.
Public Class SampleDynamicObject
    Inherits DynamicObject

    ' The inner dictionary to store field names and values.
    Dim dictionary As New Dictionary(Of String, Object)

    ' Get the property value.
    Public Overrides Function TryGetMember(
        ByVal binder As System.Dynamic.GetMemberBinder,
        ByRef result As Object) As Boolean

        Return dictionary.TryGetValue(binder.Name, result)

    End Function

    ' Set the property value.
    Public Overrides Function TrySetMember(
        ByVal binder As System.Dynamic.SetMemberBinder,
        ByVal value As Object) As Boolean

        dictionary(binder.Name) = value
        Return True

    End Function

    ' Set the property value by index.
    Public Overrides Function TrySetIndex(
        ByVal binder As System.Dynamic.SetIndexBinder,
        ByVal indexes() As Object, ByVal value As Object) As Boolean

        Dim index As Integer = CInt(indexes(0))
        ' If a corresponding property already exists, set the value.
        If (dictionary.ContainsKey("Property" & index)) Then
            dictionary("Property" & index) = value
        Else
            ' If a property does not exist, create it.
            dictionary.Add("Property" & index, value)
        End If
        Return True
    End Function

    ' Get the property value by index.
    Public Overrides Function TryGetIndex(
        ByVal binder As System.Dynamic.GetIndexBinder,
        ByVal indexes() As Object, ByRef result As Object) As Boolean

        Dim index = CInt(indexes(0))
        Return dictionary.TryGetValue("Property" & index, result)
    End Function
End Class

Sub Test()
    ' Creating a dynamic object.
    Dim sampleObject As Object = New SampleDynamicObject()

    ' Creating Property0.
    ' The TrySetMember method is called.
    sampleObject.Property0 = "Zero"

    ' Getting the value by index.
    ' The TryGetIndex method is called.
    Console.WriteLine(sampleObject(0))

    ' Setting the property value by index.
    ' The TrySetIndex method is called.
    ' (This method also creates Property1.)
    sampleObject(1) = 1

    ' Getting the Property1 value.
    ' The TryGetMember method is called.
    Console.WriteLine(sampleObject.Property1)

    ' The following statement produces a run-time exception
    ' because there is no corresponding property.
    ' Console.WriteLine(sampleObject(2))
End Sub

' This code example produces the following output:

' Zero
' 1

Keterangan

Kelas yang berasal dari DynamicObject kelas dapat mengambil alih metode ini untuk menentukan bagaimana operasi yang mengakses objek menurut indeks harus dilakukan untuk objek dinamis. Ketika metode tidak ditimpa, pengikat run-time bahasa menentukan perilaku. (Dalam kebanyakan kasus, pengecualian run-time khusus bahasa dilemparkan.)

Jika metode ini ditimpa, metode ini secara otomatis dipanggil ketika Anda memiliki operasi seperti sampleObject[3] = 10 di C# atau sampleObject(3) = 10 di Visual Basic, di mana sampleObject berasal dari DynamicObject kelas .

Berlaku untuk