DynamicObject.TryInvoke(InvokeBinder, Object[], 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 des opérations qui appellent un objet. Les classes dérivées de la DynamicObject classe peuvent remplacer cette méthode pour spécifier un comportement dynamique pour les opérations telles que l’appel d’un objet ou d’un délégué.
public:
virtual bool TryInvoke(System::Dynamic::InvokeBinder ^ binder, cli::array <System::Object ^> ^ args, [Runtime::InteropServices::Out] System::Object ^ % result);
public virtual bool TryInvoke(System.Dynamic.InvokeBinder binder, object[] args, out object result);
abstract member TryInvoke : System.Dynamic.InvokeBinder * obj[] * obj -> bool
override this.TryInvoke : System.Dynamic.InvokeBinder * obj[] * obj -> bool
Public Overridable Function TryInvoke (binder As InvokeBinder, args As Object(), ByRef result As Object) As Boolean
Paramètres
- binder
- InvokeBinder
Fournit des informations sur l’opération d’appel.
- args
- Object[]
Arguments passés à l’objet pendant l’opération d’appel. Par exemple, pour l’opération sampleObject(100) , où sampleObject elle est dérivée de la DynamicObject classe, args[0] est égale à 100.
- result
- Object
Résultat de l’appel d’objet.
Retours
true si l'opération réussit ; sinon false. Si cette méthode retourne false, le classeur au moment de l’exécution de la langue détermine le comportement. (Dans la plupart des cas, une exception d’exécution spécifique au langage est levée.
Exemples
Supposons que vous avez besoin d’une structure de données pour stocker des représentations textuelles et numériques de nombres. Vous souhaitez être en mesure de spécifier la valeur de chaque propriété individuellement et de pouvoir initialiser toutes les propriétés dans une seule instruction.
L’exemple de code suivant illustre la DynamicNumber classe, qui est dérivée de la DynamicObject classe.
DynamicNumber remplace la méthode pour activer l’initialisation TryInvoke de toutes les propriétés à la fois. Il remplace également les méthodes et TryGetMember les méthodes pour permettre l’accès TrySetMember à des propriétés d’objet individuelles.
// The class derived from DynamicObject.
public class DynamicNumber : 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;
}
// Initializing properties with arguments' values.
public override bool TryInvoke(
InvokeBinder binder, object[] args, out object result)
{
// The invoke operation in this case takes two arguments.
// The first one is integer and the second one is string.
if ((args.Length == 2) &&
(args[0].GetType() == typeof(int)) &&
(args[1].GetType() == typeof(String)))
{
// If the property already exists,
// its value is changed.
// Otherwise, a new property is created.
if (dictionary.ContainsKey("Numeric"))
dictionary["Numeric"] = args[0];
else
dictionary.Add("Numeric", args[0]);
if (dictionary.ContainsKey("Textual"))
dictionary["Textual"] = args[1];
else
dictionary.Add("Textual", args[1]);
result = true;
return true;
}
else
{
// If the number of arguments is wrong,
// or if arguments are of the wrong type,
// the method returns false.
result = false;
return false;
}
}
}
class Program
{
static void Test(string[] args)
{
// Creating a dynamic object.
dynamic number = new DynamicNumber();
// Adding and initializing properties.
// The TrySetMember method is called.
number.Numeric = 1;
number.Textual = "One";
// Printing out the result.
// The TryGetMember method is called.
Console.WriteLine(number.Numeric + " " + number.Textual);
// Invoking an object.
// The TryInvoke method is called.
number(2, "Two");
Console.WriteLine(number.Numeric + " " + number.Textual);
// The following statement produces a run-time exception
// because in this example the method invocation
// expects two arguments.
// number(0);
}
}
// This code example produces the following output:
// 1 One
// 2 Two
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 appellent un objet doivent être effectuées pour un objet dynamique. Lorsque la méthode n’est pas substituée, le classeur au moment de l’exécution de la langue détermine le comportement. (Dans la plupart des cas, une exception d’exécution est levée.)
Si cette méthode est substituée, elle est appelée automatiquement lorsque vous avez une opération semblable sampleObject(100)à celle-ci, où sampleObject elle est dérivée de la DynamicObject classe.
L’opération d’appel d’un objet est prise en charge en C# mais pas dans Visual Basic. Le compilateur Visual Basic n’émet jamais de code pour utiliser cette méthode, et le langage Visual Basic ne prend pas en charge la syntaxe comme sampleObject(100).