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

Definition

Stellt die Implementierung für Vorgänge bereit, die einen Wert nach Index festlegen. Von der DynamicObject-Klasse abgeleitete Klassen können diese Methode überschreiben, um dynamisches Verhalten für Vorgänge anzugeben, die auf Objekte mit einem angegebenen Index zugreifen.

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

Stellt Informationen zum Vorgang bereit.

indexes
Object[]

Die Indizes, die bei dem Vorgang verwendet werden. Beispielsweise ist für den sampleObject[3] = 10 Vorgang in C# (sampleObject(3) = 10 in Visual Basic) gleich 3, indexes[0] wobei sampleObject von der DynamicObject -Klasse abgeleitet wird.

value
Object

Der Wert, der auf das Objekt mit dem angegebenen Index festgelegt werden soll. Beispielsweise ist für den sampleObject[3] = 10 Vorgang in C# (sampleObject(3) = 10 in Visual Basic) gleich 10, value wobei sampleObject von der DynamicObject -Klasse abgeleitet wird.

Gibt zurück

true, wenn der Vorgang erfolgreich ist, andernfalls false. Wenn die Methode false zurückgibt, wird das Verhalten vom Laufzeitbinder der Sprache bestimmt. (In den meisten Fällen wird eine sprachspezifische Laufzeitausnahme ausgelöst.)

Beispiele

Angenommen, Sie möchten ein Objekt erstellen, in dem auf Eigenschaften entweder über Namen wie Property0, Property1usw. oder nach Index zugegriffen werden kann, sodass zsampleObject.Property0. B. in C# oder sampleObject(0) in Visual Basic gleichwertig sampleObject[0] ist.

Im folgenden Codebeispiel wird die SampleDynamicObject -Klasse veranschaulicht, die von der DynamicObject -Klasse abgeleitet wird. Die SampleDynamicObject -Klasse enthält ein Objekt vom Dictionary<string, object> Typ (Dictionary(Of String, Object) in Visual Basic), um die Schlüssel-Wert-Paare zu speichern. SampleDynamicObjectüberschreibt die Methoden undTryGetIndex, um den TrySetIndex Zugriff nach Index zu ermöglichen. Die Methoden und TryGetMember werden überschrieben, um den TrySetMember Zugriff anhand des Eigenschaftennamens zu ermöglichen.

// 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

Hinweise

Von der DynamicObject -Klasse abgeleitete Klassen können diese Methode überschreiben, um anzugeben, wie Vorgänge, die nach Index auf ein Objekt zugreifen, für ein dynamisches Objekt ausgeführt werden sollen. Wenn die Methode nicht überschrieben wird, bestimmt die Laufzeitbindung der Sprache das Verhalten. (In den meisten Fällen wird eine sprachspezifische Laufzeitausnahme ausgelöst.)

Wenn diese Methode überschrieben wird, wird sie automatisch aufgerufen, wenn Sie einen Vorgang wie sampleObject[3] = 10 in C# oder sampleObject(3) = 10 in Visual Basic haben, wobei sampleObject von der DynamicObject -Klasse abgeleitet wird.

Gilt für: