DynamicObject Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
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. |