Udostępnij za pośrednictwem


DynamicObject Klasa

Definicja

Udostępnia klasę bazową do określania zachowania dynamicznego w czasie wykonywania. Ta klasa musi być dziedziczona z; Nie można utworzyć wystąpienia bezpośrednio.

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
[<System.Serializable>]
type DynamicObject = class
    interface IDynamicMetaObjectProvider
Public Class DynamicObject
Implements IDynamicMetaObjectProvider
Dziedziczenie
DynamicObject
Pochodne
Atrybuty
Implementuje

Przykłady

Załóżmy, że chcesz podać alternatywną składnię uzyskiwania dostępu do wartości w słowniku, aby zamiast pisać sampleDictionary["Text"] = "Sample text" (sampleDictionary("Text") = "Sample text"w Języku Visual Basic), możesz napisać .sampleDictionary.Text = "Sample text" Ponadto ta składnia ma być niewrażliwa na wielkość liter, więc sampleDictionary.Text jest ona równoważna sampleDictionary.text.

W poniższym przykładzie kodu pokazano klasę DynamicDictionary , która pochodzi z DynamicObject klasy . Klasa DynamicDictionary zawiera obiekt Dictionary<string, object> typu (Dictionary(Of String, Object) w Visual Basic) do przechowywania par klucz-wartość i zastępuje TrySetMember metody i TryGetMember do obsługi nowej składni. Udostępnia Count również właściwość , która pokazuje, ile właściwości dynamicznych zawiera słownik.

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

Aby uzyskać więcej przykładów, zobacz Creating Wrappers with DynamicObject (Tworzenie otoek za pomocą obiektu DynamicObject ) w blogu języka C# Frequently Asked Questions (Często zadawane pytania).

Uwagi

Klasa DynamicObject umożliwia zdefiniowanie operacji, które można wykonywać na obiektach dynamicznych i sposobie wykonywania tych operacji. Można na przykład zdefiniować, co się stanie, gdy próbujesz pobrać lub ustawić właściwość obiektu, wywołać metodę lub wykonać standardowe operacje matematyczne, takie jak dodawanie i mnożenie.

Ta klasa może być przydatna, jeśli chcesz utworzyć wygodniejszy protokół dla biblioteki. Jeśli na przykład użytkownicy biblioteki muszą używać składni, takiej jak Scriptobj.SetProperty("Count", 1), możesz zapewnić możliwość korzystania z znacznie prostszej składni, takiej jak scriptobj.Count = 1.

Nie można bezpośrednio utworzyć wystąpienia DynamicObject klasy . Aby zaimplementować zachowanie dynamiczne, możesz chcieć dziedziczyć z DynamicObject klasy i zastąpić niezbędne metody. Jeśli na przykład potrzebujesz tylko operacji na potrzeby ustawiania i pobierania właściwości, możesz zastąpić tylko TrySetMember metody i TryGetMember .

Aby włączyć dynamiczne zachowanie dla wystąpień klas pochodzących z DynamicObject klasy, należy użyć słowa kluczowego dynamic . Aby uzyskać więcej informacji, zobacz Używanie dynamicznego typu.

W języku Visual Basic operacje dynamiczne są obsługiwane przez późne powiązanie. Aby uzyskać więcej informacji, zobacz Wczesne i późne powiązanie (Visual Basic).

W poniższym przykładzie kodu pokazano, jak utworzyć wystąpienie klasy pochodzącej DynamicObject z klasy.

public class SampleDynamicObject : DynamicObject {}  
//...  
dynamic sampleObject = new SampleDynamicObject ();  
Public Class SampleDynamicObject   
    Inherits DynamicObject  
'...  
Dim sampleObject As Object = New SampleDynamicObject()  

Możesz również dodać własne składowe do klas pochodnych z DynamicObject klasy . Jeśli klasa definiuje właściwości, a także zastępuje metodę TrySetMember , środowisko uruchomieniowe języka dynamicznego (DLR) najpierw używa powiązania języka, aby wyszukać statyczną definicję właściwości w klasie. Jeśli nie ma takiej właściwości, biblioteka DLR wywołuje metodę TrySetMember .

Klasa DynamicObject implementuje interfejs IDynamicMetaObjectProviderDLR, który umożliwia udostępnianie wystąpień DynamicObject klasy między językami obsługującymi model współdziałania DLR. Na przykład możesz utworzyć wystąpienie DynamicObject klasy w języku C#, a następnie przekazać je do funkcji IronPython. Aby uzyskać więcej informacji, zobacz Dynamic Language Runtime Overview (Omówienie środowiska uruchomieniowego języka dynamicznego).

Uwaga

Jeśli masz prosty scenariusz, w którym potrzebujesz obiektu, który może dodawać i usuwać elementy członkowskie tylko w czasie wykonywania, ale nie musi definiować określonych operacji i nie ma statycznych składowych, użyj ExpandoObject klasy .

Jeśli masz bardziej zaawansowany scenariusz, w którym musisz zdefiniować sposób, w jaki obiekty dynamiczne uczestniczą w protokole współdziałania, lub musisz zarządzać buforowaniem szybkiej dynamicznej wysyłania DLR, utwórz własną implementację interfejsu IDynamicMetaObjectProvider .

Konstruktory

DynamicObject()

Umożliwia typom pochodnym inicjowanie nowego wystąpienia DynamicObject typu.

Metody

Equals(Object)

Określa, czy dany obiekt jest taki sam, jak bieżący obiekt.

(Odziedziczone po Object)
GetDynamicMemberNames()

Zwraca wyliczenie wszystkich dynamicznych nazw elementów członkowskich.

GetHashCode()

Służy jako domyślna funkcja skrótu.

(Odziedziczone po Object)
GetMetaObject(Expression)

Udostępnia element DynamicMetaObject , który wysyła do dynamicznych metod wirtualnych. Obiekt można hermetyzować wewnątrz innego DynamicMetaObject , aby zapewnić niestandardowe zachowanie poszczególnych akcji. Ta metoda obsługuje infrastrukturę środowiska uruchomieniowego języka dynamicznego dla implementatorów języka i nie jest przeznaczona do użycia bezpośrednio z kodu.

GetType()

Type Pobiera wartość bieżącego wystąpienia.

(Odziedziczone po Object)
MemberwiseClone()

Tworzy płytkią kopię bieżącego Objectelementu .

(Odziedziczone po Object)
ToString()

Zwraca ciąg reprezentujący bieżący obiekt.

(Odziedziczone po Object)
TryBinaryOperation(BinaryOperationBinder, Object, Object)

Zapewnia implementację operacji binarnych. Klasy pochodzące z DynamicObject klasy mogą zastąpić tę metodę w celu określenia dynamicznego zachowania operacji, takich jak dodawanie i mnożenie.

TryConvert(ConvertBinder, Object)

Zapewnia implementację operacji konwersji typów. Klasy pochodne z DynamicObject klasy mogą zastąpić tę metodę, aby określić zachowanie dynamiczne dla operacji, które konwertują obiekt z jednego typu na inny.

TryCreateInstance(CreateInstanceBinder, Object[], Object)

Zapewnia implementację operacji, które inicjują nowe wystąpienie obiektu dynamicznego. Ta metoda nie jest przeznaczona do użycia w języku C# ani Visual Basic.

TryDeleteIndex(DeleteIndexBinder, Object[])

Zapewnia implementację operacji, które usuwają obiekt według indeksu. Ta metoda nie jest przeznaczona do użycia w języku C# ani Visual Basic.

TryDeleteMember(DeleteMemberBinder)

Zapewnia implementację operacji, które usuwają element członkowski obiektu. Ta metoda nie jest przeznaczona do użycia w języku C# ani Visual Basic.

TryGetIndex(GetIndexBinder, Object[], Object)

Zapewnia implementację operacji, które pobierają wartość według indeksu. Klasy pochodzące z DynamicObject klasy mogą zastąpić tę metodę w celu określenia dynamicznego zachowania operacji indeksowania.

TryGetMember(GetMemberBinder, Object)

Zapewnia implementację operacji, które pobierają wartości elementów członkowskich. Klasy pochodzące z DynamicObject klasy mogą zastąpić tę metodę, aby określić zachowanie dynamiczne dla operacji, takich jak pobieranie wartości dla właściwości.

TryInvoke(InvokeBinder, Object[], Object)

Zapewnia implementację operacji, które wywołują obiekt. Klasy pochodzące z DynamicObject klasy mogą zastąpić tę metodę w celu określenia dynamicznego zachowania operacji, takich jak wywoływanie obiektu lub delegata.

TryInvokeMember(InvokeMemberBinder, Object[], Object)

Zapewnia implementację operacji, które wywołują element członkowski. Klasy pochodzące z DynamicObject klasy mogą zastąpić tę metodę w celu określenia dynamicznego zachowania operacji, takich jak wywoływanie metody.

TrySetIndex(SetIndexBinder, Object[], Object)

Zapewnia implementację operacji, które ustawiają wartość według indeksu. Klasy pochodzące z DynamicObject klasy mogą zastąpić tę metodę w celu określenia dynamicznego zachowania operacji, które uzyskują dostęp do obiektów przez określony indeks.

TrySetMember(SetMemberBinder, Object)

Zapewnia implementację operacji, które ustawiają wartości elementów członkowskich. Klasy pochodzące z DynamicObject klasy mogą zastąpić tę metodę w celu określenia dynamicznego zachowania dla operacji, takich jak ustawienie wartości dla właściwości.

TryUnaryOperation(UnaryOperationBinder, Object)

Zapewnia implementację operacji jednoargumentowych. Klasy pochodzące z DynamicObject klasy mogą zastąpić tę metodę w celu określenia dynamicznego zachowania operacji, takich jak negacja, przyrost lub dekrementacja.

Dotyczy