DynamicObject.TrySetIndex(SetIndexBinder, Object[], Object) Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Zapewnia implementację operacji, które ustawiają wartość według indeksu. Klasy pochodzące z DynamicObject klasy mogą zastąpić tę metodę w celu określenia dynamicznego zachowania operacji, które uzyskują dostęp do obiektów przez określony indeks.
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
Parametry
- binder
- SetIndexBinder
Zawiera informacje o operacji.
- indexes
- Object[]
Indeksy, które są używane w operacji. Na przykład dla sampleObject[3] = 10
operacji w języku C# (sampleObject(3) = 10
w Visual Basic), gdzie sampleObject
pochodzi z DynamicObject klasy, indexes[0]
jest równa 3.
- value
- Object
Wartość, która ma być ustawiona na obiekt, który ma określony indeks. Na przykład dla sampleObject[3] = 10
operacji w języku C# (sampleObject(3) = 10
w Visual Basic), gdzie sampleObject
pochodzi z DynamicObject klasy, value
jest równa 10.
Zwraca
true
jeśli operacja zakończy się pomyślnie; w przeciwnym razie , false
. Jeśli ta metoda zwróci false
wartość , powiązanie w czasie wykonywania języka określa zachowanie. (W większości przypadków zgłaszany jest wyjątek czasu wykonywania specyficzny dla języka.
Przykłady
Załóżmy, że chcesz utworzyć obiekt, w którym można uzyskać dostęp do właściwości według nazw, takich jak Property0
, Property1
itd., lub według indeksu, aby na przykład sampleObject.Property0
był odpowiednikiem sampleObject[0]
w języku C# lub sampleObject(0)
Visual Basic.
W poniższym przykładzie kodu pokazano klasę SampleDynamicObject
, która pochodzi z DynamicObject klasy . Klasa SampleDynamicObject
zawiera obiekt Dictionary<string, object>
typu (Dictionary(Of String, Object)
w Visual Basic) do przechowywania par klucz-wartość. SampleDynamicObject
zastępuje metody i TryGetIndex w celu umożliwienia TrySetIndex dostępu według indeksu. TrySetMember Zastępuje metody i TryGetMember w celu umożliwienia dostępu według nazwy właściwości.
// 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
Uwagi
Klasy pochodzące z DynamicObject klasy mogą zastąpić tę metodę, aby określić, jak operacje, które uzyskują dostęp do obiektu według indeksu, powinny być wykonywane dla obiektu dynamicznego. Jeśli metoda nie zostanie zastąpiona, powiązanie czasu wykonywania języka określa zachowanie. (W większości przypadków zgłaszany jest wyjątek czasu wykonywania specyficzny dla języka).
Jeśli ta metoda jest zastępowana, jest ona wywoływana automatycznie, gdy masz operację, taką jak sampleObject[3] = 10
w języku C# lub sampleObject(3) = 10
Visual Basic, gdzie sampleObject
pochodzi z DynamicObject klasy .