DynamicObject.TrySetIndex(SetIndexBinder, Object[], Object) Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Poskytuje implementaci operací, které nastavují hodnotu podle indexu. Třídy odvozené z DynamicObject třídy mohou přepsat tuto metodu k určení dynamického chování operací, které přistupují k objektům pomocí zadaného indexu.
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
Poskytuje informace o operaci.
- indexes
- Object[]
Indexy, které se v operaci používají. Například pro operaci sampleObject[3] = 10 v jazyce C# (sampleObject(3) = 10 v Visual Basic), kde sampleObject je odvozen z třídy DynamicObject, indexes[0] je rovno 3.
- value
- Object
Hodnota nastavená na objekt, který má zadaný index. Například pro operaci sampleObject[3] = 10 v jazyce C# (sampleObject(3) = 10 v Visual Basic), kde sampleObject je odvozen z třídy DynamicObject, value je rovno 10.
Návraty
trueje-li operace úspěšná; v opačném případě . false Pokud tato metoda vrátí false, run-time binder jazyka určuje chování. (Ve většině případů se vyvolá výjimka za běhu specifická pro jazyk.
Příklady
Předpokládejme, že chcete vytvořit objekt, ve kterém mohou být vlastnosti přístupné buď pomocí názvů, jako jsou Property0, Property1 atd. nebo indexem, aby například sampleObject.Property0 je ekvivalentní sampleObject[0] v jazyce C# nebo sampleObject(0) v Visual Basic.
Následující příklad kódu ukazuje SampleDynamicObject třídu, která je odvozena z DynamicObject třídy. Třída SampleDynamicObject obsahuje objekt typu Dictionary<string, object> (Dictionary(Of String, Object) v Visual Basic) pro uložení párů klíč-hodnota.
SampleDynamicObject
TrySetIndex přepíše a TryGetIndex metody pro povolení přístupu pomocí indexu. Přepíše TrySetMember a TryGetMember metody pro povolení přístupu podle názvu vlastnosti.
// 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
Poznámky
Třídy odvozené z DynamicObject třídy mohou přepsat tuto metodu určit, jak operace, které přistupují k objektu pomocí indexu, pro dynamický objekt. Pokud metoda není přepsána, pořadač za běhu jazyka určuje chování. (Ve většině případů se vyvolá výjimka za běhu specifická pro jazyk.)
Pokud je tato metoda přepsána, je automaticky vyvolána, pokud máte operaci, jako je sampleObject[3] = 10 v jazyce C# nebo sampleObject(3) = 10 v Visual Basic, kde sampleObject je odvozen z třídy DynamicObject.