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);
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[]

呼び出し操作中にオブジェクトに渡される引数。 たとえば、sampleObjectDynamicObject クラスから派生するsampleObject(100)操作の場合、args[0]は 100 になります。

result
Object

オブジェクト呼び出しの結果。

返品

操作が正常に終了した場合は true。それ以外の場合は false。 このメソッドが falseを返す場合、言語のランタイム バインダーによって動作が決定されます。 (ほとんどの場合、言語固有のランタイム例外がスローされます。

数値のテキスト表現と数値表現を格納するためのデータ構造が必要であるとします。 各プロパティの値を個別に指定し、1 つのステートメントですべてのプロパティを初期化できるようにする必要があります。

次のコード例は、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)などの操作があるときに自動的に呼び出されます。ここで、 sampleObjectDynamicObject クラスから派生します。

オブジェクトを呼び出す操作は C# ではサポートされていますが、Visual Basicではサポートされていません。 Visual Basic コンパイラは、このメソッドを使用するコードを出力しません。Visual Basic言語では、sampleObject(100) などの構文はサポートされていません。

適用対象