DynamicObject.TryInvokeMember(InvokeMemberBinder, Object[], Object) メソッド

定義

メンバーを呼び出す操作の実装を提供します。 DynamicObject クラスから派生したクラスは、このメソッドをオーバーライドして、メソッドの呼び出しなどの操作の動的な動作を指定できます。

public:
 virtual bool TryInvokeMember(System::Dynamic::InvokeMemberBinder ^ binder, cli::array <System::Object ^> ^ args, [Runtime::InteropServices::Out] System::Object ^ % result);
public virtual bool TryInvokeMember(System.Dynamic.InvokeMemberBinder binder, object[] args, out object result);
abstract member TryInvokeMember : System.Dynamic.InvokeMemberBinder * obj[] * obj -> bool
override this.TryInvokeMember : System.Dynamic.InvokeMemberBinder * obj[] * obj -> bool
Public Overridable Function TryInvokeMember (binder As InvokeMemberBinder, args As Object(), ByRef result As Object) As Boolean

パラメーター

binder
InvokeMemberBinder

動的操作に関する情報を提供します。 binder.Name プロパティは、動的操作を実行するメンバーの名前を提供します。 たとえば、sampleObjectDynamicObject クラスから派生したクラスのインスタンスであるステートメント sampleObject.SampleMethod(100)の場合、binder.Nameは "SampleMethod" を返します。 binder.IgnoreCase プロパティは、メンバー名で大文字と小文字が区別されるかどうかを指定します。

args
Object[]

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

result
Object

メンバー呼び出しの結果。

返品

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

ディクショナリ内の値にアクセスするための代替構文を指定するとします。sampleDictionary["Text"] = "Sample text" (Visual Basic では sampleDictionary("Text") = "Sample text") を記述する代わりに、sampleDictionary.Text = "Sample text"を記述できます。 また、このディクショナリのすべての標準辞書メソッドを呼び出せるようにする必要があります。

次のコード例は、DynamicDictionary クラスから派生したDynamicObject クラスを示しています。 DynamicDictionary クラスには、キーと値のペアを格納する Dictionary<string, object> 型 (Dictionary(Of String, Object) in Visual Basic) のオブジェクトが含まれています。 Dictionary<TKey,TValue> クラスのメソッドをサポートするためにTryInvokeMember メソッドをオーバーライドし、新しい構文をサポートするためにTrySetMemberメソッドとTryGetMember メソッドをオーバーライドします。 また、すべてのディクショナリ キーと値を出力する Print メソッドも提供します。

// Add using System.Reflection;
// to the beginning of the file.

// The class derived from DynamicObject.
public class DynamicDictionary : DynamicObject
{
    // The inner dictionary.
    Dictionary<string, object> dictionary
        = new Dictionary<string, object>();

    // Getting a property.
    public override bool TryGetMember(
        GetMemberBinder binder, out object result)
    {
        return dictionary.TryGetValue(binder.Name, out result);
    }

    // Setting a property.
    public override bool TrySetMember(
        SetMemberBinder binder, object value)
    {
        dictionary[binder.Name] = value;
        return true;
    }

    // Calling a method.
    public override bool TryInvokeMember(
        InvokeMemberBinder binder, object[] args, out object result)
    {
        Type dictType = typeof(Dictionary<string, object>);
        try
        {
            result = dictType.InvokeMember(
                         binder.Name,
                         BindingFlags.InvokeMethod,
                         null, dictionary, args);
            return true;
        }
        catch
        {
            result = null;
            return false;
        }
    }

    // This methods prints out dictionary elements.
    public void Print()
    {
        foreach (var pair in dictionary)
            Console.WriteLine(pair.Key + " " + pair.Value);
        if (dictionary.Count == 0)
            Console.WriteLine("No elements in the dictionary.");
    }
}

class Program
{
    static void Main(string[] args)
    {
        // Creating a dynamic dictionary.
        dynamic person = new DynamicDictionary();

        // Adding new dynamic properties.
        // The TrySetMember method is called.
        person.FirstName = "Ellen";
        person.LastName = "Adams";

        // Calling a method defined in the DynmaicDictionary class.
        // The Print method is called.
        person.Print();

        Console.WriteLine(
            "Removing all the elements from the dictionary.");

        // Calling a method that is not defined in the DynamicDictionary class.
        // The TryInvokeMember method is called.
        person.Clear();

        // Calling the Print method again.
        person.Print();

        // The following statement throws an exception at run time.
        // There is no Sample method
        // in the dictionary or in the DynamicDictionary class.
        // person.Sample();
    }
}

// This example has the following output:

// FirstName Ellen
// LastName Adams
// Removing all the elements from the dictionary.
// No elements in the dictionary.
' Add Imports System.Reflection
' to the beginning of the file.

' The class derived from DynamicObject.
Public Class DynamicDictionary
    Inherits DynamicObject

    ' The inner dictionary.
    Dim dictionary As New Dictionary(Of String, Object)

    ' Getting a property value.
    Public Overrides Function TryGetMember(
        ByVal binder As System.Dynamic.GetMemberBinder,
        ByRef result As Object) As Boolean

        Return dictionary.TryGetValue(binder.Name, result)
    End Function

    ' Setting a property value.
    Public Overrides Function TrySetMember(
        ByVal binder As System.Dynamic.SetMemberBinder,
        ByVal value As Object) As Boolean

        dictionary(binder.Name) = value
        Return True
    End Function


    ' Calling a method.
    Public Overrides Function TryInvokeMember(
        ByVal binder As System.Dynamic.InvokeMemberBinder,
        ByVal args() As Object, ByRef result As Object) As Boolean

        Dim dictType As Type = GetType(Dictionary(Of String, Object))
        Try
            result = dictType.InvokeMember(
                         binder.Name,
                         BindingFlags.InvokeMethod,
                         Nothing, dictionary, args)
            Return True
        Catch ex As Exception
            result = Nothing
            Return False
        End Try
    End Function

    ' This method prints out dictionary elements.
    Public Sub Print()
        For Each pair In dictionary
            Console.WriteLine(pair.Key & " " & pair.Value)
        Next
        If (dictionary.Count = 0) Then
            Console.WriteLine("No elements in the dictionary.")
        End If
    End Sub
End Class

Sub Test()
    ' Creating a dynamic dictionary.
    Dim person As Object = New DynamicDictionary()

    ' Adding new dynamic properties.
    ' The TrySetMember method is called.
    person.FirstName = "Ellen"
    person.LastName = "Adams"

    ' Calling a method defined in the DynmaicDictionary class.
    ' The Print method is called.
    person.Print()

    Console.WriteLine(
        "Removing all the elements from the dictionary.")

    ' Calling a method that is not defined in the DynamicDictionary class.
    ' The TryInvokeMember method is called.
    person.Clear()

    ' Calling the Print method again.
    person.Print()

    ' The following statement throws an exception at run time.
    ' There is no Sample method 
    ' in the dictionary or in the DynamicDictionary class.
    ' person.Sample()
End Sub


' This example has the following output:

' FirstName Ellen 
' LastName Adams
' Removing all the elements from the dictionary.
' No elements in the dictionary.

注釈

DynamicObject クラスから派生したクラスは、このメソッドをオーバーライドして、動的オブジェクトに対してオブジェクト メンバーを呼び出す操作を実行する方法を指定できます。 メソッドがオーバーライドされない場合、言語のランタイム バインダーによって動作が決まります。 (ほとんどの場合、言語固有のランタイム例外がスローされます)。

このメソッドがオーバーライドされると、 sampleObject.SampleMethod(100)などの操作を実行すると自動的に呼び出されます。 sampleObjectDynamicObject クラスから派生します。

DynamicObject クラスから派生したクラスに独自のメソッドを追加することもできます。 たとえば、 TryInvokeMember メソッドをオーバーライドした場合、動的ディスパッチ システムは最初に、指定したメソッドがクラスに存在するかどうかを判断しようとします。 メソッドが見つからない場合は、 TryInvokeMember 実装を使用します。

このメソッドでは、パラメーターの refout はサポートされていません。 args配列内のすべてのパラメーターが値渡しされます。

適用対象