この記事は機械翻訳されています。英語版の記事を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語

DynamicObject クラス

 

公開日: 2016年10月

実行時の動的な動作を指定する基底クラスを提供します。 このクラスは継承される必要があります。直接インスタンス化することはできません。

名前空間:   System.Dynamic
アセンブリ:  System.Core (System.Core.dll 内)

System.Object
  System.Dynamic.DynamicObject
    System.Windows.Interop.DynamicScriptObject

[SerializableAttribute]
public class DynamicObject : IDynamicMetaObjectProvider

名前説明
System_CAPS_protmethodDynamicObject()

有効に派生した型の新しいインスタンスを初期化するために、 DynamicObject 型です。

名前説明
System_CAPS_pubmethodEquals(Object)

指定したオブジェクトが、現在のオブジェクトと等しいかどうかを判断します。(Object から継承されます。)

System_CAPS_protmethodFinalize()

オブジェクトが、ガベージ コレクションによって収集される前に、リソースの解放とその他のクリーンアップ操作の実行を試みることができるようにします。(Object から継承されます。)

System_CAPS_pubmethodGetDynamicMemberNames()

すべての動的メンバー名の列挙を返します。

System_CAPS_pubmethodGetHashCode()

既定のハッシュ関数として機能します。(Object から継承されます。)

System_CAPS_pubmethodGetMetaObject(Expression)

提供、 DynamicMetaObject 動的な仮想メソッドにディスパッチしています。 中に別のオブジェクトをカプセル化できる DynamicMetaObject を個別のアクションのカスタム動作を提供します。 このメソッドは、言語実装者にとって、動的言語ランタイム インフラストラクチャをサポートし、コードから直接使用するものではありません。

System_CAPS_pubmethodGetType()

現在のインスタンスの Type を取得します。(Object から継承されます。)

System_CAPS_protmethodMemberwiseClone()

現在の Object の簡易コピーを作成します。(Object から継承されます。)

System_CAPS_pubmethodToString()

現在のオブジェクトを表す文字列を返します。(Object から継承されます。)

System_CAPS_pubmethodTryBinaryOperation(BinaryOperationBinder, Object, Object)

二項演算の実装を提供します。 派生したクラス、 DynamicObject クラスは、加算や乗算などの操作の動的な動作を指定するには、このメソッドをオーバーライドできます。

System_CAPS_pubmethodTryConvert(ConvertBinder, Object)

変換操作の種類の実装を提供します。 派生したクラス、 DynamicObject クラスは、オブジェクトを別の 1 つの型に変換する操作に動的な動作を指定するには、このメソッドをオーバーライドできます。

System_CAPS_pubmethodTryCreateInstance(CreateInstanceBinder, Object[], Object)

動的オブジェクトの新しいインスタンスを初期化する演算の実装を提供します。 このメソッドは、c# または Visual Basic で使用するものはありません。

System_CAPS_pubmethodTryDeleteIndex(DeleteIndexBinder, Object[])

インデックスによってオブジェクトを削除する操作の実装を提供します。 このメソッドは、c# または Visual Basic で使用するものはありません。

System_CAPS_pubmethodTryDeleteMember(DeleteMemberBinder)

オブジェクトのメンバーを削除する操作の実装を提供します。 このメソッドは、c# または Visual Basic で使用するものはありません。

System_CAPS_pubmethodTryGetIndex(GetIndexBinder, Object[], Object)

インデックスによって、値を取得する操作の実装を提供します。 派生したクラス、 DynamicObject クラスは、インデックス操作用の動的な動作を指定するには、このメソッドをオーバーライドできます。

System_CAPS_pubmethodTryGetMember(GetMemberBinder, Object)

メンバーの値を取得する操作の実装を提供します。 派生したクラス、 DynamicObject クラスは、プロパティの値を取得する場合などの動的な動作を指定するには、このメソッドをオーバーライドできます。

System_CAPS_pubmethodTryInvoke(InvokeBinder, Object[], Object)

オブジェクトを呼び出す操作の実装を提供します。 派生したクラス、 DynamicObject クラスは、オブジェクトまたはデリゲートを呼び出す場合などの動的な動作を指定するには、このメソッドをオーバーライドできます。

System_CAPS_pubmethodTryInvokeMember(InvokeMemberBinder, Object[], Object)

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

System_CAPS_pubmethodTrySetIndex(SetIndexBinder, Object[], Object)

インデックスによって、値を設定する操作の実装を提供します。 派生したクラス、 DynamicObject クラスは、指定されたインデックスによってオブジェクトにアクセスする操作の動的な動作を指定するには、このメソッドをオーバーライドできます。

System_CAPS_pubmethodTrySetMember(SetMemberBinder, Object)

メンバーの値を設定する操作の実装を提供します。 派生したクラス、 DynamicObject クラスは、プロパティの値の設定などの操作の動的な動作を指定するには、このメソッドをオーバーライドできます。

System_CAPS_pubmethodTryUnaryOperation(UnaryOperationBinder, Object)

単項演算の実装を提供します。 派生したクラス、 DynamicObject クラスは、否定、インクリメントなどの操作の動的な動作を指定または減分するには、このメソッドをオーバーライドできます。

The DynamicObject class enables you to define which operations can be performed on dynamic objects and how to perform those operations. For example, you can define what happens when you try to get or set an object property, call a method, or perform standard mathematical operations such as addition and multiplication.

This class can be useful if you want to create a more convenient protocol for a library. For example, if users of your library have to use syntax like Scriptobj.SetProperty("Count", 1), you can provide the ability to use much simpler syntax, like scriptobj.Count = 1.

You cannot directly create an instance of the DynamicObject class. To implement the dynamic behavior, you may want to inherit from the DynamicObject class and override necessary methods. For example, if you need only operations for setting and getting properties, you can override just the M:System.Dynamic.DynamicObject.TrySetMember(System.Dynamic.SetMemberBinder,System.Object) and M:System.Dynamic.DynamicObject.TryGetMember(System.Dynamic.GetMemberBinder,System.Object@) methods.

In C#, to enable dynamic behavior for instances of classes derived from the DynamicObject class, you must use the dynamic keyword. For more information, see Using Type Dynamic (C# Programming Guide).

In Visual Basic, dynamic operations are supported by late binding. For more information, see Early and Late Binding.

The following code example demonstrates how to create an instance of a class that is derived from the DynamicObject class.

public class SampleDynamicObject : DynamicObject {}
//...
dynamic sampleObject = new SampleDynamicObject ();

You can also add your own members to classes derived from the DynamicObject class. If your class defines properties and also overrides the M:System.Dynamic.DynamicObject.TrySetMember(System.Dynamic.SetMemberBinder,System.Object) method, the dynamic language runtime (DLR) first uses the language binder to look for a static definition of a property in the class. If there is no such property, the DLR calls the M:System.Dynamic.DynamicObject.TrySetMember(System.Dynamic.SetMemberBinder,System.Object) method.

The DynamicObject class implements the DLR interface T:System.Dynamic.IDynamicMetaObjectProvider, which enables you to share instances of the DynamicObject class between languages that support the DLR interoperability model. For example, you can create an instance of the DynamicObject class in C# and then pass it to an IronPython function. For more information, see Dynamic Language Runtime Overview and documentation on the CodePlexhttp://go.microsoft.com/fwlink/?LinkId=141028 Web site.

System_CAPS_noteメモ

If you have a simple scenario in which you need an object that can only add and remove members at run time but that does not need to define specific operations and does not have static members, use the T:System.Dynamic.ExpandoObject class.

If you have a more advanced scenario in which you need to define how dynamic objects participate in the interoperability protocol, or you need to manage DLR fast dynamic dispatch caching, create your own implementation of the T:System.Dynamic.IDynamicMetaObjectProvider interface.

Assume that you want to provide alternative syntax for accessing values in a dictionary, so that instead of writing sampleDictionary["Text"] = "Sample text" (sampleDictionary("Text") = "Sample text" in Visual Basic), you can write sampleDictionary.Text = "Sample text". Also, you want this syntax to be case-insensitive, so that sampleDictionary.Text is equivalent to sampleDictionary.text.

The following code example demonstrates the DynamicDictionary class, which is derived from the DynamicObject class. The DynamicDictionary class contains an object of the Dictionary<string, object> type (Dictionary(Of String, Object) in Visual Basic) to store the key-value pairs, and overrides the M:System.Dynamic.DynamicObject.TrySetMember(System.Dynamic.SetMemberBinder,System.Object) and M:System.Dynamic.DynamicObject.TryGetMember(System.Dynamic.GetMemberBinder,System.Object@) methods to support the new syntax. It also provides a Count property, which shows how many dynamic properties the dictionary contains.

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

    // This property returns the number of elements
    // in the inner dictionary.
    public int Count
    {
        get
        {
            return dictionary.Count;
        }
    }

    // If you try to get a value of a property 
    // not defined in the class, this method is called.
    public override bool TryGetMember(
        GetMemberBinder binder, out object result)
    {
        // Converting the property name to lowercase
        // so that property names become case-insensitive.
        string name = binder.Name.ToLower();

        // If the property name is found in a dictionary,
        // set the result parameter to the property value and return true.
        // Otherwise, return false.
        return dictionary.TryGetValue(name, out result);
    }

    // If you try to set a value of a property that is
    // not defined in the class, this method is called.
    public override bool TrySetMember(
        SetMemberBinder binder, object value)
    {
        // Converting the property name to lowercase
        // so that property names become case-insensitive.
        dictionary[binder.Name.ToLower()] = value;

        // You can always add a value to a dictionary,
        // so this method always returns true.
        return true;
    }
}

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";

        // Getting values of the dynamic properties.
        // The TryGetMember method is called.
        // Note that property names are case-insensitive.
        Console.WriteLine(person.firstname + " " + person.lastname);

        // Getting the value of the Count property.
        // The TryGetMember is not called, 
        // because the property is defined in the class.
        Console.WriteLine(
            "Number of dynamic properties:" + person.Count);

        // The following statement throws an exception at run time.
        // There is no "address" property,
        // so the TryGetMember method returns false and this causes a
        // RuntimeBinderException.
        // Console.WriteLine(person.address);
    }
}

// This example has the following output:
// Ellen Adams
// Number of dynamic properties: 2

For more examples, see Creating Wrappers with DynamicObjecthttp://go.microsoft.com/fwlink/?LinkId=169008 on the C# Frequently Asked Questions blog.

ユニバーサル Windows プラットフォーム
8 以降で使用可能
.NET Framework
4.0 以降で使用可能
ポータブル クラス ライブラリ
サポート対象: 移植可能 .NET プラットフォーム
Silverlight
4.0 以降で使用可能
Windows Phone Silverlight
8.0 以降で使用可能
Windows Phone
8.1 以降で使用可能

この型のパブリック static (Visual Basic では Shared ) メンバーはスレッド セーフです。インスタンス メンバーの場合は、スレッド セーフであるとは限りません。

トップに戻る
表示: