ExpandoObject Klasa

Definicja

Reprezentuje obiekt, którego elementy członkowskie mogą być dynamicznie dodawane i usuwane w czasie wykonywania.Represents an object whose members can be dynamically added and removed at run time.

public ref class ExpandoObject sealed : System::Collections::Generic::ICollection<System::Collections::Generic::KeyValuePair<System::String ^, System::Object ^>>, System::Collections::Generic::IDictionary<System::String ^, System::Object ^>, System::Collections::Generic::IEnumerable<System::Collections::Generic::KeyValuePair<System::String ^, System::Object ^>>, System::ComponentModel::INotifyPropertyChanged, System::Dynamic::IDynamicMetaObjectProvider
public sealed class ExpandoObject : System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<string,object>>, System.Collections.Generic.IDictionary<string,object>, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string,object>>, System.ComponentModel.INotifyPropertyChanged, System.Dynamic.IDynamicMetaObjectProvider
type ExpandoObject = class
    interface IDynamicMetaObjectProvider
    interface IDictionary<string, obj>
    interface INotifyPropertyChanged
    interface ICollection<KeyValuePair<string, obj>>
    interface seq<KeyValuePair<string, obj>>
    interface IEnumerable
Public NotInheritable Class ExpandoObject
Implements ICollection(Of KeyValuePair(Of String, Object)), IDictionary(Of String, Object), IDynamicMetaObjectProvider, IEnumerable(Of KeyValuePair(Of String, Object)), INotifyPropertyChanged
Dziedziczenie
ExpandoObject
Implementuje

Uwagi

Klasa ExpandoObject pozwala dodawać i usuwać członków swoich wystąpień w czasie wykonywania, a także ustawiać i pobierać wartości tych elementów członkowskich.The ExpandoObject class enables you to add and delete members of its instances at run time and also to set and get values of these members. Ta klasa obsługuje powiązanie dynamiczne, które pozwala używać standardowej składni, takiej jak sampleObject.sampleMember, zamiast bardziej złożonej składni, takiej jak sampleObject.GetAttribute("sampleMember").This class supports dynamic binding, which enables you to use standard syntax like sampleObject.sampleMember instead of more complex syntax like sampleObject.GetAttribute("sampleMember").

Klasa ExpandoObject implementuje standardowy IDynamicMetaObjectProviderinterfejsu środowiska uruchomieniowego języka dynamicznego (DLR), który umożliwia udostępnianie wystąpień klasy ExpandoObject między językami obsługującymi model współdziałania DLR.The ExpandoObject class implements the standard Dynamic Language Runtime (DLR) interface IDynamicMetaObjectProvider, which enables you to share instances of the ExpandoObject class between languages that support the DLR interoperability model. Na przykład można utworzyć wystąpienie klasy ExpandoObject w C# , a następnie przekazać je do funkcji IronPython.For example, you can create an instance of the ExpandoObject class in C# and then pass it to an IronPython function. Aby uzyskać więcej informacji, zobacz Omówienie środowiska uruchomieniowego języka dynamicznego i wprowadzenie do narzędzia expandobject na stronie sieci Web C# często zadawanych pytań.For more information, see Dynamic Language Runtime Overview and Introducing the ExpandoObject on the C# Frequently Asked Questions Web site.

Klasa ExpandoObject jest implementacją koncepcji obiektu dynamicznego, która umożliwia pobieranie, ustawianie i wywoływanie elementów członkowskich.The ExpandoObject class is an implementation of the dynamic object concept that enables getting, setting, and invoking members. Jeśli chcesz zdefiniować typy, które mają własną semantykę wysyłania dynamicznego, użyj klasy DynamicObject.If you want to define types that have their own dynamic dispatch semantics, use the DynamicObject class. Jeśli chcesz zdefiniować sposób, w jaki obiekty dynamiczne uczestniczą w protokole współdziałania i zarządzają DLR Fast dynamicznej pamięci podręcznej, Utwórz własną implementację interfejsu IDynamicMetaObjectProvider.If you want to define how dynamic objects participate in the interoperability protocol and manage DLR fast dynamic dispatch caching, create your own implementation of the IDynamicMetaObjectProvider interface.

Tworzenie wystąpieniaCreating an Instance

C#Aby włączyć późne wiązanie dla wystąpienia klasy ExpandoObject, należy użyć słowa kluczowego dynamic.In C#, to enable late binding for an instance of the ExpandoObject class, you must use the dynamic keyword. Aby uzyskać więcej informacji, zobacz Korzystanie z typu dynamicznego.For more information, see Using Type dynamic.

W Visual Basic operacje dynamiczne są obsługiwane przez późne wiązanie.In Visual Basic, dynamic operations are supported by late binding. Aby uzyskać więcej informacji, zobacz wczesne i późne wiązanie.For more information, see Early and Late Binding.

Poniższy przykład kodu pokazuje, jak utworzyć wystąpienie klasy ExpandoObject.The following code example demonstrates how to create an instance of the ExpandoObject class.

dynamic sampleObject = new ExpandoObject();
Dim sampleObject As Object = New ExpandoObject()

Dodawanie nowych członkówAdding New Members

Możesz dodać właściwości, metody i zdarzenia do wystąpień klasy ExpandoObject.You can add properties, methods, and events to instances of the ExpandoObject class.

Poniższy przykład kodu pokazuje, jak dodać nową właściwość do wystąpienia klasy ExpandoObject.The following code example demonstrates how to add a new property to an instance of the ExpandoObject class.

sampleObject.test = "Dynamic Property";
Console.WriteLine(sampleObject.test);
Console.WriteLine(sampleObject.test.GetType());
// This code example produces the following output:
// Dynamic Property
// System.String
sampleObject.Test = "Dynamic Property"
Console.WriteLine(sampleObject.test)
Console.WriteLine(sampleObject.test.GetType())
' This code example produces the following output:
' Dynamic Property
' System.String

Metody reprezentują wyrażenia lambda, które są przechowywane jako Delegaty, które mogą być wywoływane, gdy są one zbędne.The methods represent lambda expressions that are stored as delegates, which can be invoked when they are needed. Poniższy przykład kodu pokazuje, jak dodać metodę, która zwiększa wartość właściwości dynamicznej.The following code example demonstrates how to add a method that increments a value of the dynamic property.

sampleObject.number = 10;
sampleObject.Increment = (Action)(() => { sampleObject.number++; });

// Before calling the Increment method.
Console.WriteLine(sampleObject.number);

sampleObject.Increment();

// After calling the Increment method.
Console.WriteLine(sampleObject.number);
// This code example produces the following output:
// 10
// 11
sampleObject.Number = 10
sampleObject.Increment = Function() sampleObject.Number + 1
' Before calling the Increment method.
Console.WriteLine(sampleObject.number)

sampleObject.Increment.Invoke()

' After calling the Increment method.
Console.WriteLine(sampleObject.number)
' This code example produces the following output:
' 10
' 11

Poniższy przykład kodu pokazuje, jak dodać zdarzenie do wystąpienia klasy ExpandoObject.The following code example demonstrates how to add an event to an instance of the ExpandoObject class.

class Program  
{  
    static void Main(string[] args)  
    {  
        dynamic sampleObject = new ExpandoObject();  
  
        // Create a new event and initialize it with null.  
        sampleObject.sampleEvent = null;  
  
        // Add an event handler.  
        sampleObject.sampleEvent += new EventHandler(SampleHandler);  
  
        // Raise an event for testing purposes.  
        sampleObject.sampleEvent(sampleObject, new EventArgs());  
   }  
  
    // Event handler.  
    static void SampleHandler(object sender, EventArgs e)  
    {  
        Console.WriteLine("SampleHandler for {0} event", sender);  
    }  
}  
// This code example produces the following output:  
// SampleHandler for System.Dynamic.ExpandoObject event.  
Module Module1  
  
Sub Main()  
    Dim sampleObject As Object = New ExpandoObject()  
  
    ' Create a new event and initialize it with null.  
    sampleObject.sampleEvent = Nothing  
  
    ' Add an event handler.  
    Dim handler As EventHandler = AddressOf SampleHandler  
    sampleObject.sampleEvent =   
        [Delegate].Combine(sampleObject.sampleEvent, handler)  
  
    ' Raise an event for testing purposes.  
    sampleObject.sampleEvent.Invoke(sampleObject, New EventArgs())  
  
End Sub  
  
' Event handler.  
Sub SampleHandler(ByVal sender As Object, ByVal e As EventArgs)  
    Console.WriteLine("SampleHandler for {0} event", sender)  
End Sub  
  
' This code example produces the following output:  
' SampleHandler for System.Dynamic.ExpandoObject event.  
  
End Module  

Przekazywanie jako parametrPassing As a Parameter

Wystąpienia klasy ExpandoObject można przekazać jako parametry.You can pass instances of the ExpandoObject class as parameters. Należy zauważyć, że te wystąpienia są traktowane jako obiekty C# dynamiczne w obiektach z późnym wiązaniem w Visual Basic.Note that these instances are treated as dynamic objects in C# and late-bound objects in Visual Basic. Oznacza to, że nie masz funkcji IntelliSense dla elementów członkowskich obiektów i nie otrzymujesz błędów kompilatora podczas wywoływania nieistniejących członków.This means that you do not have IntelliSense for object members and you do not receive compiler errors when you call non-existent members. Jeśli wywołasz element członkowski, który nie istnieje, wystąpi wyjątek.If you call a member that does not exist, an exception occurs.

Poniższy przykład kodu demonstruje sposób tworzenia i używania metody do drukowania nazw i wartości właściwości.The following code example demonstrates how you can create and use a method to print the names and values of properties.

class Program
{
    static void Main(string[] args)
    {
        dynamic employee, manager;

        employee = new ExpandoObject();
        employee.Name = "John Smith";
        employee.Age = 33;

        manager = new ExpandoObject();
        manager.Name = "Allison Brown";
        manager.Age = 42;
        manager.TeamSize = 10;

        WritePerson(manager);
        WritePerson(employee);
    }
    private static void WritePerson(dynamic person)
    {
        Console.WriteLine("{0} is {1} years old.",
                          person.Name, person.Age);
        // The following statement causes an exception
        // if you pass the employee object.
        // Console.WriteLine("Manages {0} people", person.TeamSize);
    }
}
// This code example produces the following output:
// John Smith is 33 years old.
// Allison Brown is 42 years old.
Sub Main()
    Dim employee, manager As Object

    employee = New ExpandoObject()
    employee.Name = "John Smith"
    employee.Age = 33

    manager = New ExpandoObject()
    manager.Name = "Allison Brown"
    manager.Age = 42
    manager.TeamSize = 10

    WritePerson(manager)
    WritePerson(employee)
End Sub

Private Sub WritePerson(ByVal person As Object)

    Console.WriteLine("{0} is {1} years old.",
                      person.Name, person.Age)
    ' The following statement causes an exception
    ' if you pass the employee object.
    ' Console.WriteLine("Manages {0} people", person.TeamSize)

End Sub

Wyliczanie i usuwanie członkówEnumerating and Deleting Members

Klasa ExpandoObject implementuje interfejs IDictionary<String, Object>.The ExpandoObject class implements the IDictionary<String, Object> interface. Umożliwia to Wyliczenie elementów członkowskich dodanych do wystąpienia klasy ExpandoObject w czasie wykonywania.This enables enumeration of members added to the instance of the ExpandoObject class at run time. Może to być przydatne, jeśli w czasie kompilacji nie wiesz, jakie elementy członkowskie mogą mieć wystąpienia.This can be useful if you do not know at compile time what members an instance might have.

Poniższy przykład kodu pokazuje, jak można rzutować wystąpienie klasy ExpandoObject na interfejs IDictionary<TKey,TValue> i wyliczać elementy członkowskie wystąpienia.The following code example shows how you can cast an instance of the ExpandoObject class to the IDictionary<TKey,TValue> interface and enumerate the instance's members.

dynamic employee = new ExpandoObject();
employee.Name = "John Smith";
employee.Age = 33;

foreach (var property in (IDictionary<String, Object>)employee)
{
    Console.WriteLine(property.Key + ": " + property.Value);
}
// This code example produces the following output:
// Name: John Smith
// Age: 33
Dim employee As Object = New ExpandoObject()
employee.Name = "John Smith"
employee.Age = 33
For Each member In CType(employee, IDictionary(Of String, Object))
    Console.WriteLine(member.Key & ": " & member.Value)
Next
' This code example produces the following output:
' Name: John Smith
' Age: 33

W językach, które nie mają składni do usuwania elementów członkowskich (takich C# jak i Visual Basic), można usunąć członka, niejawnie Rzutowanie wystąpienia ExpandoObject do interfejsu IDictionary<String, Object>, a następnie usunięcie elementu członkowskiego jako pary klucz/wartość.In languages that do not have syntax for deleting members (such as C# and Visual Basic), you can delete a member by implicitly casting an instance of the ExpandoObject to the IDictionary<String, Object> interface and then deleting the member as a key/value pair. Pokazano to w poniższym przykładzie.This is shown in the following example.

dynamic employee = new ExpandoObject();
employee.Name = "John Smith";
((IDictionary<String, Object>)employee).Remove("Name");
Dim employee As Object = New ExpandoObject()
employee.Name = "John Smith"
CType(employee, IDictionary(Of String, Object)).Remove("Name")

Otrzymywanie powiadomień o zmianach właściwościReceiving Notifications of Property Changes

Klasa ExpandoObject implementuje interfejs INotifyPropertyChanged i może zgłosić zdarzenie PropertyChanged w przypadku dodania, usunięcia lub zmodyfikowania elementu członkowskiego.The ExpandoObject class implements the INotifyPropertyChanged interface and can raise a PropertyChanged event when a member is added, deleted, or modified. Umożliwia to ExpandoObject integrację klasy z powiązaniem danych Windows Presentation Foundation (WPF) i innymi środowiskami, które wymagają powiadomienia o zmianach w zawartości obiektu.This enables ExpandoObject class integration with Windows Presentation Foundation (WPF) data binding and other environments that require notification about changes in the object content.

Poniższy przykład kodu pokazuje, jak utworzyć procedurę obsługi zdarzeń dla zdarzenia PropertyChanged.The following code example demonstrates how to create an event handler for the PropertyChanged event.

// Add "using System.ComponentModel;" line 
// to the beginning of the file.
class Program
{
    static void Test()
    {
        dynamic employee = new ExpandoObject();
        ((INotifyPropertyChanged)employee).PropertyChanged +=
            new PropertyChangedEventHandler(HandlePropertyChanges);
        employee.Name = "John Smith";
    }

    private static void HandlePropertyChanges(
        object sender, PropertyChangedEventArgs e)
    {
        Console.WriteLine("{0} has changed.", e.PropertyName);
    }
}
' Add "Imports System.ComponentModel" line 
' to the beginning of the file.
Sub Main()
    Dim employee As Object = New ExpandoObject
    AddHandler CType(
        employee, INotifyPropertyChanged).PropertyChanged,
        AddressOf HandlePropertyChanges
    employee.Name = "John Smith"
End Sub

Private Sub HandlePropertyChanges(
       ByVal sender As Object, ByVal e As PropertyChangedEventArgs)
    Console.WriteLine("{0} has changed.", e.PropertyName)
End Sub

Konstruktory

ExpandoObject()

Inicjuje nowy ExpandoObject, który nie ma elementów członkowskich.Initializes a new ExpandoObject that does not have members.

Metody

Equals(Object)

Określa, czy określony obiekt jest równy bieżącemu obiektowi.Determines whether the specified object is equal to the current object.

(Odziedziczone po Object)
GetHashCode()

Służy jako domyślna funkcja skrótu.Serves as the default hash function.

(Odziedziczone po Object)
GetType()

Pobiera Type bieżącego wystąpienia.Gets the Type of the current instance.

(Odziedziczone po Object)
MemberwiseClone()

Tworzy skróconą kopię bieżącego Object.Creates a shallow copy of the current Object.

(Odziedziczone po Object)
ToString()

Zwraca ciąg, który reprezentuje bieżący obiekt.Returns a string that represents the current object.

(Odziedziczone po Object)

Jawne implementacje interfejsu

ICollection<KeyValuePair<String,Object>>.Add(KeyValuePair<String,Object>)

Dodaje określoną wartość do ICollection<T>, która ma określony klucz.Adds the specified value to the ICollection<T> that has the specified key.

ICollection<KeyValuePair<String,Object>>.Clear()

Powoduje usunięcie wszystkich elementów z kolekcji.Removes all items from the collection.

ICollection<KeyValuePair<String,Object>>.Contains(KeyValuePair<String,Object>)

Określa, czy ICollection<T> zawiera określony klucz i wartość.Determines whether the ICollection<T> contains a specific key and value.

ICollection<KeyValuePair<String,Object>>.CopyTo(KeyValuePair<String,Object>[], Int32)

Kopiuje elementy ICollection<T> do tablicy typu KeyValuePair<TKey,TValue>, rozpoczynając od określonego indeksu tablicy.Copies the elements of the ICollection<T> to an array of type KeyValuePair<TKey,TValue>, starting at the specified array index.

ICollection<KeyValuePair<String,Object>>.Count

Pobiera liczbę elementów w ICollection<T>.Gets the number of elements in the ICollection<T>.

ICollection<KeyValuePair<String,Object>>.IsReadOnly

Pobiera wartość wskazującą, czy kolekcja ICollection<T> jest przeznaczona tylko do odczytu.Gets a value indicating whether the ICollection<T> is read-only.

ICollection<KeyValuePair<String,Object>>.Remove(KeyValuePair<String,Object>)

Usuwa klucz i wartość z kolekcji.Removes a key and value from the collection.

IDictionary<String,Object>.Add(String, Object)

Dodaje określony klucz i wartość do słownika.Adds the specified key and value to the dictionary.

IDictionary<String,Object>.ContainsKey(String)

Określa, czy słownik zawiera określony klucz.Determines whether the dictionary contains the specified key.

IDictionary<String,Object>.Item[String]

Pobiera lub ustawia element, który ma określony klucz.Gets or sets the element that has the specified key.

IDictionary<String,Object>.Keys

Pobiera ICollection<T> zawierający klucze IDictionary<TKey,TValue>.Gets an ICollection<T> that contains the keys of the IDictionary<TKey,TValue>.

IDictionary<String,Object>.Remove(String)

Usuwa element, który ma określony klucz z IDictionary.Removes the element that has the specified key from the IDictionary.

IDictionary<String,Object>.TryGetValue(String, Object)

Pobiera wartość skojarzoną z określonym kluczem.Gets the value associated with the specified key.

IDictionary<String,Object>.Values

Pobiera ICollection<T> zawierający wartości z IDictionary<TKey,TValue>.Gets an ICollection<T> that contains the values in the IDictionary<TKey,TValue>.

IDynamicMetaObjectProvider.GetMetaObject(Expression)

Dostarczony obiekt jest wysyłany do dynamicznych metod wirtualnych.The provided MetaObject will dispatch to the dynamic virtual methods. Obiekt można hermetyzować wewnątrz innego obiektu, aby zapewnić niestandardowe zachowanie poszczególnych akcji.The object can be encapsulated inside another MetaObject to provide custom behavior for individual actions.

IEnumerable.GetEnumerator()

Zwraca moduł wyliczający, który dokonuje iteracji w kolekcji.Returns an enumerator that iterates through the collection.

IEnumerable<KeyValuePair<String,Object>>.GetEnumerator()

Zwraca moduł wyliczający, który dokonuje iteracji w kolekcji.Returns an enumerator that iterates through the collection.

INotifyPropertyChanged.PropertyChanged

Występuje, gdy wartość właściwości zostanie zmieniona.Occurs when a property value changes.

Metody rozszerzania

Remove<TKey,TValue>(IDictionary<TKey,TValue>, TKey, TValue)

Próbuje usunąć wartość o określonym key z dictionary.Tries to remove the value with the specified key from the dictionary.

TryAdd<TKey,TValue>(IDictionary<TKey,TValue>, TKey, TValue)

Próbuje dodać określony key i value do dictionary.Tries to add the specified key and value to the dictionary.

CopyToDataTable<T>(IEnumerable<T>)

Zwraca DataTable, który zawiera kopie obiektów DataRow, przy użyciu obiektu wejściowego IEnumerable<T>, gdzie T parametru generycznego jest DataRow.Returns a DataTable that contains copies of the DataRow objects, given an input IEnumerable<T> object where the generic parameter T is DataRow.

CopyToDataTable<T>(IEnumerable<T>, DataTable, LoadOption)

Kopiuje DataRow obiektów do określonego DataTable, używając obiektu wejściowego IEnumerable<T>, gdzie T parametru generycznego jest DataRow.Copies DataRow objects to the specified DataTable, given an input IEnumerable<T> object where the generic parameter T is DataRow.

CopyToDataTable<T>(IEnumerable<T>, DataTable, LoadOption, FillErrorEventHandler)

Kopiuje DataRow obiektów do określonego DataTable, używając obiektu wejściowego IEnumerable<T>, gdzie T parametru generycznego jest DataRow.Copies DataRow objects to the specified DataTable, given an input IEnumerable<T> object where the generic parameter T is DataRow.

Cast<TResult>(IEnumerable)

Rzutuje elementy IEnumerable określonego typu.Casts the elements of an IEnumerable to the specified type.

OfType<TResult>(IEnumerable)

Filtruje elementy IEnumerable w oparciu o określony typ.Filters the elements of an IEnumerable based on a specified type.

AsParallel(IEnumerable)

Włącza przetwarzanie równoległe zapytania.Enables parallelization of a query.

AsQueryable(IEnumerable)

Konwertuje IEnumerable na IQueryable.Converts an IEnumerable to an IQueryable.

Ancestors<T>(IEnumerable<T>)

Zwraca kolekcję elementów, które zawierają elementy nadrzędne każdego węzła w kolekcji źródłowej.Returns a collection of elements that contains the ancestors of every node in the source collection.

Ancestors<T>(IEnumerable<T>, XName)

Zwraca przefiltrowany kolekcji elementów, które zawierają elementy nadrzędne każdego węzła w kolekcji źródłowej.Returns a filtered collection of elements that contains the ancestors of every node in the source collection. Kolekcja zawiera tylko elementy, które mają pasujące XName.Only elements that have a matching XName are included in the collection.

DescendantNodes<T>(IEnumerable<T>)

Zwraca kolekcję węzłów podrzędnych każdego dokumentu i elementu w kolekcji źródłowej.Returns a collection of the descendant nodes of every document and element in the source collection.

Descendants<T>(IEnumerable<T>)

Zwraca kolekcję elementów, które zawierają elementy podrzędne każdego elementu i dokumentu w kolekcji źródłowej.Returns a collection of elements that contains the descendant elements of every element and document in the source collection.

Descendants<T>(IEnumerable<T>, XName)

Zwraca przefiltrowany kolekcji elementów, które zawierają elementy podrzędne każdego elementu i dokumentu w kolekcji źródłowej.Returns a filtered collection of elements that contains the descendant elements of every element and document in the source collection. Kolekcja zawiera tylko elementy, które mają pasujące XName.Only elements that have a matching XName are included in the collection.

Elements<T>(IEnumerable<T>)

Zwraca kolekcję elementów podrzędnych każdego elementu i dokumentu w kolekcji źródłowej.Returns a collection of the child elements of every element and document in the source collection.

Elements<T>(IEnumerable<T>, XName)

Zwraca filtrowaną kolekcję elementów podrzędnych każdego elementu i dokumentu w kolekcji źródłowej.Returns a filtered collection of the child elements of every element and document in the source collection. Kolekcja zawiera tylko elementy, które mają pasujące XName.Only elements that have a matching XName are included in the collection.

InDocumentOrder<T>(IEnumerable<T>)

Zwraca kolekcję węzłów, która zawiera wszystkie węzły w kolekcji źródłowej, posortowane w kolejności dokumentu.Returns a collection of nodes that contains all nodes in the source collection, sorted in document order.

Nodes<T>(IEnumerable<T>)

Zwraca kolekcję węzłów podrzędnych każdego dokumentu i elementu w kolekcji źródłowej.Returns a collection of the child nodes of every document and element in the source collection.

Remove<T>(IEnumerable<T>)

Usuwa każdy węzeł w kolekcji źródłowej z węzła nadrzędnego.Removes every node in the source collection from its parent node.

Dotyczy