DynamicObject.TrySetMember(SetMemberBinder, Object) Méthode
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Fournit l'implémentation pour les opérations qui définissent des valeurs de membre. Les classes dérivées de la classe DynamicObject peuvent substituer cette méthode afin de spécifier le comportement dynamique pour certaines opérations telles que la définition d'une valeur pour une propriété.
public:
virtual bool TrySetMember(System::Dynamic::SetMemberBinder ^ binder, System::Object ^ value);
public virtual bool TrySetMember (System.Dynamic.SetMemberBinder binder, object value);
public virtual bool TrySetMember (System.Dynamic.SetMemberBinder binder, object? value);
abstract member TrySetMember : System.Dynamic.SetMemberBinder * obj -> bool
override this.TrySetMember : System.Dynamic.SetMemberBinder * obj -> bool
Public Overridable Function TrySetMember (binder As SetMemberBinder, value As Object) As Boolean
Paramètres
- binder
- SetMemberBinder
Fournit des informations sur l'objet qui a appelé l'opération dynamique. La binder.Name
propriété fournit le nom du membre auquel la valeur est affectée. Par exemple, pour l’instruction sampleObject.SampleProperty = "Test"
, où sampleObject
est un instance de la classe dérivée de la DynamicObject classe, binder.Name
retourne « SampleProperty ». La binder.IgnoreCase
propriété spécifie si le nom du membre respecte la casse.
- value
- Object
Valeur à affecter au membre. Par exemple, pour sampleObject.SampleProperty = "Test"
, où sampleObject
est un instance de la classe dérivée de la classe, le DynamicObjectvalue
est « Test ».
Retours
true
si l'opération réussit ; sinon false
. Si cette méthode retourne false
, le binder d'exécution du langage détermine le comportement. (Dans la plupart des cas, une exception runtime spécifique au langage est levée.)
Exemples
Supposons que vous souhaitiez fournir une autre syntaxe pour accéder aux valeurs dans un dictionnaire, de sorte qu’au lieu d’écrire sampleDictionary["Text"] = "Sample text"
(sampleDictionary("Text") = "Sample text"
en Visual Basic), vous pouvez écrire sampleDictionary.Text = "Sample text"
. En outre, cette syntaxe doit ne pas respecter la casse, ce qui sampleDictionary.Text
équivaut à sampleDictionary.text
.
L’exemple de code suivant illustre la DynamicDictionary
classe, qui est dérivée de la DynamicObject classe . La DynamicDictionary
classe contient un objet du Dictionary<string, object>
type (Dictionary(Of String, Object)
en Visual Basic) pour stocker les paires clé-valeur et remplace les TrySetMember méthodes et TryGetMember pour prendre en charge la nouvelle syntaxe. Il fournit également une Count
propriété, qui indique le nombre de propriétés dynamiques que contient le dictionnaire.
// The class derived from DynamicObject.
public class DynamicDictionary : DynamicObject
{
// The inner dictionary.
Dictionary<string, object> dictionary
= new Dictionary<string, object>();
// This property returns the number of elements
// in the inner dictionary.
public int Count
{
get
{
return dictionary.Count;
}
}
// If you try to get a value of a property
// not defined in the class, this method is called.
public override bool TryGetMember(
GetMemberBinder binder, out object result)
{
// Converting the property name to lowercase
// so that property names become case-insensitive.
string name = binder.Name.ToLower();
// If the property name is found in a dictionary,
// set the result parameter to the property value and return true.
// Otherwise, return false.
return dictionary.TryGetValue(name, out result);
}
// If you try to set a value of a property that is
// not defined in the class, this method is called.
public override bool TrySetMember(
SetMemberBinder binder, object value)
{
// Converting the property name to lowercase
// so that property names become case-insensitive.
dictionary[binder.Name.ToLower()] = value;
// You can always add a value to a dictionary,
// so this method always returns true.
return true;
}
}
class Program
{
static void Main(string[] args)
{
// Creating a dynamic dictionary.
dynamic person = new DynamicDictionary();
// Adding new dynamic properties.
// The TrySetMember method is called.
person.FirstName = "Ellen";
person.LastName = "Adams";
// Getting values of the dynamic properties.
// The TryGetMember method is called.
// Note that property names are case-insensitive.
Console.WriteLine(person.firstname + " " + person.lastname);
// Getting the value of the Count property.
// The TryGetMember is not called,
// because the property is defined in the class.
Console.WriteLine(
"Number of dynamic properties:" + person.Count);
// The following statement throws an exception at run time.
// There is no "address" property,
// so the TryGetMember method returns false and this causes a
// RuntimeBinderException.
// Console.WriteLine(person.address);
}
}
// This example has the following output:
// Ellen Adams
// Number of dynamic properties: 2
' The class derived from DynamicObject.
Public Class DynamicDictionary
Inherits DynamicObject
' The inner dictionary.
Dim dictionary As New Dictionary(Of String, Object)
' This property returns the number of elements
' in the inner dictionary.
ReadOnly Property Count As Integer
Get
Return dictionary.Count
End Get
End Property
' If you try to get a value of a property that is
' not defined in the class, this method is called.
Public Overrides Function TryGetMember(
ByVal binder As System.Dynamic.GetMemberBinder,
ByRef result As Object) As Boolean
' Converting the property name to lowercase
' so that property names become case-insensitive.
Dim name As String = binder.Name.ToLower()
' If the property name is found in a dictionary,
' set the result parameter to the property value and return true.
' Otherwise, return false.
Return dictionary.TryGetValue(name, result)
End Function
Public Overrides Function TrySetMember(
ByVal binder As System.Dynamic.SetMemberBinder,
ByVal value As Object) As Boolean
' Converting the property name to lowercase
' so that property names become case-insensitive.
dictionary(binder.Name.ToLower()) = value
' You can always add a value to a dictionary,
' so this method always returns true.
Return True
End Function
End Class
Sub Main()
' Creating a dynamic dictionary.
Dim person As Object = New DynamicDictionary()
' Adding new dynamic properties.
' The TrySetMember method is called.
person.FirstName = "Ellen"
person.LastName = "Adams"
' Getting values of the dynamic properties.
' The TryGetMember method is called.
' Note that property names are now case-insensitive,
' although they are case-sensitive in C#.
Console.WriteLine(person.firstname & " " & person.lastname)
' Getting the value of the Count property.
' The TryGetMember is not called,
' because the property is defined in the class.
Console.WriteLine("Number of dynamic properties:" & person.Count)
' The following statement throws an exception at run time.
' There is no "address" property,
' so the TryGetMember method returns false and this causes
' a MissingMemberException.
' Console.WriteLine(person.address)
End Sub
' This examples has the following output:
' Ellen Adams
' Number of dynamic properties: 2
Remarques
Les classes dérivées de la DynamicObject classe peuvent remplacer cette méthode pour spécifier la façon dont les opérations qui définissent une valeur sur un membre doivent être effectuées pour un objet dynamique. Lorsque la méthode n’est pas remplacée, le classeur d’exécution du langage détermine le comportement. (Dans la plupart des cas, une exception runtime spécifique au langage est levée.)
Cette méthode est appelée lorsque vous avez des instructions telles sampleObject.SampleProperty = "Test"
que , où sampleObject
est une instance de la classe dérivée de la DynamicObject classe .
Vous pouvez également ajouter vos propres membres à des classes dérivées de la DynamicObject
classe . Si votre classe définit des propriétés et remplace également la TrySetMember méthode, le runtime de langage dynamique (DLR) utilise d’abord le classeur de langage pour rechercher une définition statique d’une propriété dans la classe. S’il n’existe aucune propriété de ce type, le DLR appelle la TrySetMember méthode .