DynamicObject.TryInvoke(InvokeBinder, Object[], Object) Metod

Definition

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).

Gäller för