DynamicObject.TryInvoke(InvokeBinder, Object[], Object) Metod
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Tillhandahåller implementeringen för åtgärder som anropar ett objekt. Klasser som härleds från klassen kan åsidosätta den DynamicObject här metoden för att ange dynamiskt beteende för åtgärder som att anropa ett objekt eller ett ombud.
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);
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
Parametrar
- binder
- InvokeBinder
Innehåller information om anropsåtgärden.
- args
- Object[]
Argumenten som skickas till objektet under anropsåtgärden. För åtgärden sampleObject(100) , där sampleObject härleds från DynamicObject klassen, args[0] är till exempel lika med 100.
- result
- Object
Resultatet av objektanropet.
Returer
trueom åtgärden lyckas. annars . false Om den här metoden returnerar falseavgör körningsbindaren för språket beteendet. (I de flesta fall utlöses ett språkspecifikt körningsfel.
Exempel
Anta att du behöver en datastruktur för att lagra textbaserade och numeriska representationer av tal. Du vill kunna ange värdet för varje egenskap individuellt och även kunna initiera alla egenskaper i en enda instruktion.
I följande kodexempel visas DynamicNumber klassen, som härleds från DynamicObject klassen.
DynamicNumber åsidosätter TryInvoke metoden för att aktivera initiering av alla egenskaper samtidigt. Den åsidosätter TrySetMember också metoderna och TryGetMember för att aktivera åtkomst till enskilda objektegenskaper.
// 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
Kommentarer
Klasser som härleds från klassen kan åsidosätta den DynamicObject här metoden för att ange hur åtgärder som anropar ett objekt ska utföras för ett dynamiskt objekt. När metoden inte åsidosättas avgör körningsbindaren för språket beteendet. (I de flesta fall utlöses ett körningsfel.)
Om den här metoden åsidosättas anropas den automatiskt när du har en åtgärd som sampleObject(100), där sampleObject härleds från DynamicObject klassen.
Åtgärden för att anropa ett objekt stöds i C# men inte i Visual Basic. Den Visual Basic kompilatorn genererar aldrig kod för att använda den här metoden och Visual Basic språket stöder inte syntax som sampleObject(100).