Aracılığıyla paylaş


System.Dynamic.ExpandoObject sınıfı

Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.

sınıfı, ExpandoObject çalışma zamanında örneklerinin üyelerini ekleyip silmenize ve ayrıca bu üyelerin değerlerini ayarlamanıza ve almanıza olanak tanır. Bu sınıf, gibi sampleObject.GetAttribute("sampleMember")daha karmaşık söz dizimi yerine gibi sampleObject.sampleMember standart söz dizimi kullanmanızı sağlayan dinamik bağlamayı destekler.

sınıfı, ExpandoObject DLR birlikte çalışabilirlik modelini destekleyen diller arasında sınıfın ExpandoObject örneklerini paylaşmanızı sağlayan standart Dinamik Dil Çalışma Zamanı (DLR) arabirimini IDynamicMetaObjectProvideruygular. Örneğin, C# dilinde sınıfın ExpandoObject bir örneğini oluşturabilir ve bunu bir IronPython işlevine geçirebilirsiniz. Daha fazla bilgi için bkz . Dinamik Dil Çalışma Zamanına Genel Bakış ve ExpandoObject Tanıtımı.

ExpandoObject sınıfı, üyeleri almayı, ayarlamayı ve çağırmayı sağlayan dinamik nesne kavramının bir uygulamasıdır. Kendi dinamik dağıtım semantiğine sahip türleri tanımlamak istiyorsanız sınıfını DynamicObject kullanın. Dinamik nesnelerin birlikte çalışabilirlik protokolüne nasıl katıldığını tanımlamak ve DLR hızlı dinamik dağıtım önbelleğini yönetmek istiyorsanız, arabirimin IDynamicMetaObjectProvider kendi uygulamasını oluşturun.

Örnek oluşturma

C# dilinde, sınıfın bir örneğinde geç bağlamayı ExpandoObject etkinleştirmek için anahtar sözcüğünü dynamic kullanmanız gerekir. Daha fazla bilgi için bkz . Tür dinamik kullanma.

Visual Basic'te dinamik işlemler geç bağlama tarafından desteklenir. Daha fazla bilgi için bkz . Erken ve Geç Bağlama (Visual Basic).

Aşağıdaki kod örneğinde sınıfının bir örneğinin nasıl oluşturulacağı gösterilmektedir ExpandoObject .

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

Yeni üye ekleme

Sınıfın örneklerine ExpandoObject özellikler, yöntemler ve olaylar ekleyebilirsiniz.

Aşağıdaki kod örneği, sınıfın bir örneğine yeni bir özelliğin ExpandoObject nasıl ekleneceğini gösterir.

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

Yöntemler, temsilci olarak depolanan lambda ifadelerini temsil eder ve bunlar gerektiğinde çağrılabilir. Aşağıdaki kod örneği, dinamik özelliğin değerini artıran bir yöntemin nasıl ekleneceğini gösterir.

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

Aşağıdaki kod örneği, sınıfın bir örneğine ExpandoObject nasıl olay ekleneceğini gösterir.

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

Parametre olarak geçirme

Sınıfın ExpandoObject örneklerini parametre olarak geçirebilirsiniz. Bu örneklerin C# dilinde dinamik nesneler ve Visual Basic'te geç bağlanan nesneler olarak ele alındıklarına dikkat edin. Bu, nesne üyeleri için IntelliSense'iniz olmadığı ve var olmayan üyeleri çağırdığınızda derleyici hataları almadığınız anlamına gelir. Mevcut olmayan bir üyeyi çağırırsanız, bir özel durum oluşur.

Aşağıdaki kod örneği, özelliklerin adlarını ve değerlerini yazdırmak için nasıl bir yöntem oluşturup kullanabileceğinizi gösterir.

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

Üyeleri listeleme ve silme

ExpandoObject sınıfı, IDictionary<String, Object> arabirimini uygular. Bu, çalışma zamanında sınıfın örneğine eklenen üyelerin numaralandırmasını ExpandoObject etkinleştirir. Derleme zamanında bir örneğin sahip olabileceği üyeleri bilmiyorsanız bu yararlı olabilir.

Aşağıdaki kod örneği, sınıfının bir örneğini ExpandoObject arabirime IDictionary<TKey,TValue> nasıl dönüştürebileceğinizi ve örneğin üyelerini nasıl numaralandırabileceğinizi gösterir.

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

Üyeleri silmek için söz dizimi olmayan dillerde (C# ve Visual Basic gibi), öğesinin bir örneğini ExpandoObject örtük olarak arabirime IDictionary<String, Object> dönüştürüp ardından üyeyi anahtar/değer çifti olarak silerek üyeyi silebilirsiniz. Bu, aşağıdaki örnekte gösterilir.

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

Özellik değişikliklerinin bildirimlerini alma

ExpandoObject sınıfı arabirimini INotifyPropertyChanged uygular ve bir PropertyChanged üye eklendiğinde, silindiğinde veya değiştirildiğinde bir olay oluşturabilir. Bu, Nesne içeriğindeki değişiklikler hakkında bildirim gerektiren Windows Presentation Foundation (WPF) veri bağlaması ve diğer ortamlarla sınıf tümleştirmesi sağlar ExpandoObject .

Aşağıdaki kod örneği, olay için bir olay işleyicisinin PropertyChanged nasıl oluşturulacağını gösterir.

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