DynamicObject Class

Definition

Предоставляет базовый класс для указания динамического поведения в среде выполнения.Provides a base class for specifying dynamic behavior at run time. Этот класс должен наследоваться; создать его экземпляр напрямую нельзя.This class must be inherited from; you cannot instantiate it directly.

public ref class DynamicObject : System::Dynamic::IDynamicMetaObjectProvider
public class DynamicObject : System.Dynamic.IDynamicMetaObjectProvider
[System.Serializable]
public class DynamicObject : System.Dynamic.IDynamicMetaObjectProvider
type DynamicObject = class
    interface IDynamicMetaObjectProvider
Public Class DynamicObject
Implements IDynamicMetaObjectProvider
Inheritance
DynamicObject
Derived
Attributes
Implements

Examples

Предположим, что вы хотите предоставить альтернативный синтаксис для доступа к значениям в словаре, чтобы вместо записи sampleDictionary["Text"] = "Sample text" (sampleDictionary("Text") = "Sample text" в Visual Basic) можно было написать sampleDictionary.Text = "Sample text".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". Кроме того, этот синтаксис должен быть нечувствительным к регистру, поэтому sampleDictionary.Text эквивалентен sampleDictionary.text.Also, you want this syntax to be case-insensitive, so that sampleDictionary.Text is equivalent to sampleDictionary.text.

В следующем примере кода демонстрируется класс DynamicDictionary, производный от класса DynamicObject.The following code example demonstrates the DynamicDictionary class, which is derived from the DynamicObject class. Класс DynamicDictionary содержит объект типа Dictionary<string, object> (Dictionary(Of String, Object) в Visual Basic) для хранения пар "ключ-значение" и переопределяет методы TrySetMember и TryGetMember для поддержки нового синтаксиса.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 TrySetMember and TryGetMember methods to support the new syntax. Он также предоставляет свойство Count, которое показывает, сколько динамических свойств содержит словарь.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
' The class derived from DynamicObject.
Public Class DynamicDictionary
    Inherits DynamicObject

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

    ' This property returns the number of elements
    ' in the inner dictionary.
    ReadOnly Property Count As Integer
        Get
            Return dictionary.Count
        End Get
    End Property


    ' If you try to get a value of a property that is
    ' not defined in the class, this method is called.

    Public Overrides Function TryGetMember(
        ByVal binder As System.Dynamic.GetMemberBinder,
        ByRef result As Object) As Boolean

        ' Converting the property name to lowercase
        ' so that property names become case-insensitive.
        Dim name As String = 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, result)
    End Function

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

        ' 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
    End Function
End Class

Sub Main()
    ' 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"

    ' Getting values of the dynamic properties.
    ' The TryGetMember method is called.
    ' Note that property names are now case-insensitive,
    ' although they are case-sensitive in C#.
    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 MissingMemberException.
    ' Console.WriteLine(person.address)
End Sub
' This examples has the following output:
' Ellen Adams
' Number of dynamic properties: 2

Дополнительные примеры см. в разделе Создание оболочек с DynamicObject в блоге C# с часто задаваемыми вопросами.For more examples, see Creating Wrappers with DynamicObject on the C# Frequently Asked Questions blog.

Remarks

Класс 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. Например, если пользователи библиотеки должны использовать синтаксис, подобный Scriptobj.SetProperty("Count", 1), можно предоставить возможность использовать гораздо более простой синтаксис, например scriptobj.Count = 1.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.

Нельзя напрямую создать экземпляр класса DynamicObject.You cannot directly create an instance of the DynamicObject class. Чтобы реализовать динамическое поведение, может потребоваться наследование от класса DynamicObject и переопределение необходимых методов.To implement the dynamic behavior, you may want to inherit from the DynamicObject class and override necessary methods. Например, если требуются только операции для настройки и получения свойств, можно переопределить только методы TrySetMember и TryGetMember.For example, if you need only operations for setting and getting properties, you can override just the TrySetMember and TryGetMember methods.

C#Чтобы включить динамическое поведение для экземпляров классов, производных от класса DynamicObject, необходимо использовать ключевое слово dynamic.In C#, to enable dynamic behavior for instances of classes derived from the DynamicObject class, you must use the dynamic keyword. Дополнительные сведения см. в разделе Использование типа dynamic.For more information, see Using Type dynamic.

В Visual Basic динамические операции поддерживаются с помощью позднего связывания.In Visual Basic, dynamic operations are supported by late binding. Дополнительные сведения см. в разделе раннее и позднее связывание (Visual Basic).For more information, see Early and Late Binding (Visual Basic).

В следующем примере кода показано, как создать экземпляр класса, производного от класса DynamicObject.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 ();  
Public Class SampleDynamicObject   
    Inherits DynamicObject  
'...  
Dim sampleObject As Object = New SampleDynamicObject()  

Можно также добавлять собственные члены в классы, производные от класса DynamicObject.You can also add your own members to classes derived from the DynamicObject class. Если ваш класс определяет свойства, а также переопределяет метод TrySetMember, то среда выполнения динамического языка (DLR) сначала использует связыватель языка для поиска статического определения свойства в классе.If your class defines properties and also overrides the TrySetMember method, the dynamic language runtime (DLR) first uses the language binder to look for a static definition of a property in the class. Если такого свойства нет, среда DLR вызывает метод TrySetMember.If there is no such property, the DLR calls the TrySetMember method.

Класс DynamicObject реализует интерфейс DLR IDynamicMetaObjectProvider, который позволяет совместно использовать экземпляры класса DynamicObject между языками, поддерживающими модель взаимодействия DLR.The DynamicObject class implements the DLR interface IDynamicMetaObjectProvider, which enables you to share instances of the DynamicObject class between languages that support the DLR interoperability model. Например, можно создать экземпляр класса DynamicObject в C# и передать его в функцию IronPython.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.

Note

Если имеется простой сценарий, в котором необходим объект, который может добавлять и удалять элементы только во время выполнения, но не должен определять конкретные операции и не имеет статических членов, используйте класс ExpandoObject.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 ExpandoObject class.

Если у вас есть более сложный сценарий, в котором необходимо определить, как динамические объекты участвуют в протоколе взаимодействия, или необходимо управлять быстрым динамическим кэшированием среды DLR, создайте собственную реализацию интерфейса IDynamicMetaObjectProvider.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 IDynamicMetaObjectProvider interface.

Constructors

DynamicObject()

Позволяет производным типам инициализировать новый экземпляр типа DynamicObject.Enables derived types to initialize a new instance of the DynamicObject type.

Methods

Equals(Object)

Определяет, равен ли заданный объект текущему объекту.Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetDynamicMemberNames()

Возвращает перечисление имен всех динамических членов.Returns the enumeration of all dynamic member names.

GetHashCode()

Служит хэш-функцией по умолчанию.Serves as the default hash function.

(Inherited from Object)
GetMetaObject(Expression)

Предоставляет объект DynamicMetaObject, вызывающий динамические виртуальные методы.Provides a DynamicMetaObject that dispatches to the dynamic virtual methods. Объект можно инкапсулировать в другой объект DynamicMetaObject, чтобы обеспечить пользовательское поведение для отдельных действий.The object can be encapsulated inside another DynamicMetaObject to provide custom behavior for individual actions. Данный метод поддерживает инфраструктуру среды DLR для разработчиков языков и не предназначен для непосредственного использования из кода.This method supports the Dynamic Language Runtime infrastructure for language implementers and it is not intended to be used directly from your code.

GetType()

Возвращает объект Type для текущего экземпляра.Gets the Type of the current instance.

(Inherited from Object)
MemberwiseClone()

Создает неполную копию текущего объекта Object.Creates a shallow copy of the current Object.

(Inherited from Object)
ToString()

Возвращает строку, представляющую текущий объект.Returns a string that represents the current object.

(Inherited from Object)
TryBinaryOperation(BinaryOperationBinder, Object, Object)

Предоставляет реализацию для двоичных операций.Provides implementation for binary operations. Классы, производные от класса DynamicObject, могут переопределять этот метод, чтобы задать динамическое поведение для таких операций, как сложение и умножение.Classes derived from the DynamicObject class can override this method to specify dynamic behavior for operations such as addition and multiplication.

TryConvert(ConvertBinder, Object)

Предоставляет реализацию для операций преобразования типа.Provides implementation for type conversion operations. Классы, производные от класса DynamicObject, могут переопределять этот метод, чтобы задать динамическое поведение для операций, преобразующих объект из одного типа в другой.Classes derived from the DynamicObject class can override this method to specify dynamic behavior for operations that convert an object from one type to another.

TryCreateInstance(CreateInstanceBinder, Object[], Object)

Предоставляет реализацию для операций, инициализирующих новый экземпляр динамического объекта.Provides the implementation for operations that initialize a new instance of a dynamic object. Этот метод не предназначен для использования в C# или Visual Basic.This method is not intended for use in C# or Visual Basic.

TryDeleteIndex(DeleteIndexBinder, Object[])

Предоставляет реализацию для операций, удаляющих объект по индексу.Provides the implementation for operations that delete an object by index. Этот метод не предназначен для использования в C# или Visual Basic.This method is not intended for use in C# or Visual Basic.

TryDeleteMember(DeleteMemberBinder)

Предоставляет реализацию для операций, удаляющих элемент объекта.Provides the implementation for operations that delete an object member. Этот метод не предназначен для использования в C# или Visual Basic.This method is not intended for use in C# or Visual Basic.

TryGetIndex(GetIndexBinder, Object[], Object)

Предоставляет реализацию для операций, получающих значение по индексу.Provides the implementation for operations that get a value by index. Классы, производные от класса DynamicObject, могут переопределять этот метод, чтобы задать динамическое поведение для операций индексации.Classes derived from the DynamicObject class can override this method to specify dynamic behavior for indexing operations.

TryGetMember(GetMemberBinder, Object)

Обеспечивает реализацию операций, которые получают значения членов.Provides the implementation for operations that get member values. Классы, производные от класса DynamicObject, могут переопределять этот метод, чтобы задать динамическое поведение для таких операций, как получение значения свойства.Classes derived from the DynamicObject class can override this method to specify dynamic behavior for operations such as getting a value for a property.

TryInvoke(InvokeBinder, Object[], Object)

Предоставляет реализацию для операций, вызывающих объект.Provides the implementation for operations that invoke an object. Классы, производные от класса DynamicObject, могут переопределять этот метод, чтобы задать динамическое поведение для таких операций, как вызов объекта или делегата.Classes derived from the DynamicObject class can override this method to specify dynamic behavior for operations such as invoking an object or a delegate.

TryInvokeMember(InvokeMemberBinder, Object[], Object)

Обеспечивает реализацию операций, которые вызывают член.Provides the implementation for operations that invoke a member. Классы, производные от класса DynamicObject, могут переопределять этот метод, чтобы задать динамическое поведение для таких операций, как вызов метода.Classes derived from the DynamicObject class can override this method to specify dynamic behavior for operations such as calling a method.

TrySetIndex(SetIndexBinder, Object[], Object)

Предоставляет реализацию для операций, задающих значение по индексу.Provides the implementation for operations that set a value by index. Классы, производные от класса DynamicObject, могут переопределять этот метод, чтобы задать динамическое поведение для операций, осуществляющих доступ к объектам по заданному индексу.Classes derived from the DynamicObject class can override this method to specify dynamic behavior for operations that access objects by a specified index.

TrySetMember(SetMemberBinder, Object)

Обеспечивает реализацию операций, которые задают значения членов.Provides the implementation for operations that set member values. Классы, производные от класса DynamicObject, могут переопределять этот метод, чтобы задать динамическое поведение для таких операций, как задание значения свойства.Classes derived from the DynamicObject class can override this method to specify dynamic behavior for operations such as setting a value for a property.

TryUnaryOperation(UnaryOperationBinder, Object)

Предоставляет реализацию для унарных операций.Provides implementation for unary operations. Классы, производные от класса DynamicObject, могут переопределять этот метод, чтобы задать динамическое поведение для таких операций, как вычитание, увеличение или уменьшение.Classes derived from the DynamicObject class can override this method to specify dynamic behavior for operations such as negation, increment, or decrement.

Applies to