DynamicObject.TrySetIndex(SetIndexBinder, Object[], Object) Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет реализацию для операций, задающих значение по индексу. Классы, производные от класса DynamicObject, могут переопределять этот метод, чтобы задать динамическое поведение для операций, осуществляющих доступ к объектам по заданному индексу.
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
Параметры
- binder
- SetIndexBinder
Предоставляет сведения об операции.
- indexes
- Object[]
Индексы, которые используются в операции. Например, для sampleObject[3] = 10
операции в C# (sampleObject(3) = 10
в Visual Basic), где sampleObject
является производным DynamicObject от класса , indexes[0]
равно 3.
- value
- Object
Значение, которое необходимо задать для объекта с заданным индексом. Например, для sampleObject[3] = 10
операции в C# (sampleObject(3) = 10
в Visual Basic), где sampleObject
является производным DynamicObject от класса , value
равно 10.
Возвращаемое значение
Значение true
, если операция выполнена успешно; в противном случае — значение false
. Если данный метод возвращает значение false
, поведение определяется связывателем среды языка. (В большинстве случаев создается языковое исключение во время выполнения).
Примеры
Предположим, что вы хотите создать объект, в котором доступ к свойствам можно получить либо по таким именам, как Property0
, Property1
и т. д., либо по индексу, чтобы, например, sampleObject.Property0
было эквивалентно sampleObject[0]
в C# или sampleObject(0)
в Visual Basic.
В следующем примере кода демонстрируется SampleDynamicObject
класс , производный DynamicObject от класса . Класс SampleDynamicObject
содержит объект Dictionary<string, object>
типа (Dictionary(Of String, Object)
в Visual Basic) для хранения пар "ключ-значение". SampleDynamicObject
переопределяет TrySetIndex методы и TryGetIndex , чтобы разрешить доступ по индексу. Он переопределяет TrySetMember методы и TryGetMember , чтобы разрешить доступ по имени свойства.
// 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
Комментарии
Классы, производные DynamicObject от класса , могут переопределять этот метод, чтобы указать, как операции, которые обращаются к объекту по индексу, должны выполняться для динамического объекта. Если метод не переопределен, связыватель времени выполнения языка определяет поведение. (В большинстве случаев создается языковое исключение во время выполнения).
Если этот метод переопределен, он автоматически вызывается при наличии операции, например sampleObject[3] = 10
в C# или sampleObject(3) = 10
в Visual Basic, где sampleObject
является производным DynamicObject от класса .