Поделиться через


DynamicObject.TryInvoke(InvokeBinder, Object[], Object) Метод

Определение

Предоставляет реализацию для операций, вызывающих объект. Классы, производные от класса DynamicObject, могут переопределять этот метод, чтобы задать динамическое поведение для таких операций, как вызов объекта или делегата.

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

Параметры

binder
InvokeBinder

Предоставляет сведения об операции вызова.

args
Object[]

Аргументы, переданные объекту во время операции вызова. Например, для sampleObject(100) операции , где sampleObject является производным DynamicObject от класса , args[0] равно 100.

result
Object

Результат вызова объекта.

Возвращаемое значение

Значение true, если операция выполнена успешно; в противном случае — значение false. Если данный метод возвращает значение false, поведение определяется связывателем среды языка. (В большинстве случаев создается языковое исключение во время выполнения).

Примеры

Предположим, что для хранения текстовых и числовых представлений чисел требуется структура данных. Вы хотите иметь возможность указать значение для каждого свойства по отдельности, а также иметь возможность инициализировать все свойства в одной инструкции.

В следующем примере кода демонстрируется DynamicNumber класс , производный DynamicObject от класса . DynamicNumber переопределяет метод , TryInvoke чтобы включить инициализацию всех свойств одновременно. Он также переопределяет TrySetMember методы и TryGetMember , чтобы обеспечить доступ к отдельным свойствам объекта.

// 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

Комментарии

Классы, производные DynamicObject от класса , могут переопределить этот метод, чтобы указать, как операции, вызывающие объект, должны выполняться для динамического объекта. Если метод не переопределен, связыватель времени выполнения языка определяет поведение. (В большинстве случаев создается исключение во время выполнения).

Если этот метод переопределен, он автоматически вызывается при наличии такой операции, как sampleObject(100), где sampleObject является производным DynamicObject от класса .

Операция вызова объекта поддерживается в C#, но не в Visual Basic. Компилятор Visual Basic никогда не выдает код для использования этого метода, а язык Visual Basic не поддерживает такой синтаксис, как sampleObject(100).

Применяется к