DynamicObject Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Poskytuje základní třídu pro určení dynamického chování za běhu. Tato třída musí být zděděna z; nemůžete vytvořit jeho instanci přímo.
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
- Dědičnost
-
DynamicObject
- Odvozené
- Atributy
- Implementuje
Příklady
Předpokládejme, že chcete poskytnout alternativní syntaxi pro přístup k hodnotám ve slovníku, takže místo psaní sampleDictionary["Text"] = "Sample text"
(sampleDictionary("Text") = "Sample text"
v jazyce Visual Basic) můžete psát sampleDictionary.Text = "Sample text"
. Také chcete, aby tato syntaxe nerozlišuje malá a velká písmena, takže je ekvivalentní sampleDictionary.Text
k sampleDictionary.text
.
Následující příklad kódu ukazuje DynamicDictionary
třídu, která je odvozena z DynamicObject
třídy . Třída DynamicDictionary
obsahuje objekt Dictionary<string, object>
typu (Dictionary(Of String, Object)
v jazyce Visual Basic) pro uložení párů klíč-hodnota a přepíše TrySetMember metody a TryGetMember pro podporu nové syntaxe. Poskytuje také Count
vlastnost, která ukazuje, kolik dynamických vlastností slovník obsahuje.
// 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
Další příklady najdete v tématu Vytváření obálek pomocí objektu DynamicObject na blogu Nejčastější dotazy k jazyku C#.
Poznámky
Třída DynamicObject
umožňuje definovat, které operace lze provádět s dynamickými objekty a jak tyto operace provádět. Můžete například definovat, co se stane, když se pokusíte získat nebo nastavit vlastnost objektu, volat metodu nebo provádět standardní matematické operace, jako je sčítání a násobení.
Tato třída může být užitečná, pokud chcete vytvořit pohodlnější protokol pro knihovnu. Pokud například uživatelé vaší knihovny musí používat syntaxi, jako Scriptobj.SetProperty("Count", 1)
je , můžete poskytnout možnost používat mnohem jednodušší syntaxi, například scriptobj.Count = 1
.
Instanci třídy nelze vytvořit DynamicObject
přímo. Chcete-li implementovat dynamické chování, můžete chtít dědit z DynamicObject
třídy a přepsat potřebné metody. Pokud například potřebujete pouze operace pro nastavení a získání vlastností, můžete přepsat pouze TrySetMember metody a TryGetMember .
Pokud chcete v jazyce C# povolit dynamické chování pro instance tříd odvozených z DynamicObject
třídy , musíte použít dynamic
klíčové slovo . Další informace najdete v tématu Použití dynamického typu.
V jazyce Visual Basic jsou dynamické operace podporovány pozdní vazbou. Další informace najdete v tématu Časná a pozdní vazba (Visual Basic).
Následující příklad kódu ukazuje, jak vytvořit instanci třídy, která je odvozena DynamicObject
z třídy .
public class SampleDynamicObject : DynamicObject {}
//...
dynamic sampleObject = new SampleDynamicObject ();
Public Class SampleDynamicObject
Inherits DynamicObject
'...
Dim sampleObject As Object = New SampleDynamicObject()
Můžete také přidat vlastní členy do tříd odvozených z DynamicObject
třídy . Pokud vaše třída definuje vlastnosti a také přepisuje metodu TrySetMember , modul runtime dynamického jazyka (DLR) nejprve použije jazykový pořadač k vyhledání statické definice vlastnosti ve třídě . Pokud taková vlastnost neexistuje, dlr volá metodu TrySetMember .
Třída DynamicObject
implementuje rozhraní IDynamicMetaObjectProviderDLR , které umožňuje sdílet instance DynamicObject
třídy mezi jazyky, které podporují model interoperability DLR. Můžete například vytvořit instanci DynamicObject
třídy v jazyce C# a pak ji předat funkci IronPython. Další informace najdete v tématu Přehled modulu RUNTIME dynamického jazyka.
Poznámka
Pokud máte jednoduchý scénář, ve kterém potřebujete objekt, který může přidávat a odebírat členy pouze za běhu, ale nemusí definovat konkrétní operace a nemá statické členy, použijte ExpandoObject třídu .
Pokud máte pokročilejší scénář, ve kterém potřebujete definovat, jak se dynamické objekty účastní protokolu interoperability, nebo potřebujete spravovat rychlé dynamické ukládání do mezipaměti dynamického odesílání DLR, vytvořte vlastní implementaci IDynamicMetaObjectProvider rozhraní.
Konstruktory
DynamicObject() |
Umožňuje odvozeným typům inicializovat novou instanci DynamicObject typu . |
Metody
Equals(Object) |
Určí, zda se zadaný objekt rovná aktuálnímu objektu. (Zděděno od Object) |
GetDynamicMemberNames() |
Vrátí výčet všech názvů dynamických členů. |
GetHashCode() |
Slouží jako výchozí hashovací funkce. (Zděděno od Object) |
GetMetaObject(Expression) |
Poskytuje , DynamicMetaObject který odesílá do dynamických virtuálních metod. Objekt může být zapouzdřen uvnitř jiného DynamicMetaObject objektu a poskytovat tak vlastní chování pro jednotlivé akce. Tato metoda podporuje infrastrukturu dynamic language runtime pro implementátory jazyka a není určena k použití přímo z vašeho kódu. |
GetType() |
Type Získá z aktuální instance. (Zděděno od Object) |
MemberwiseClone() |
Vytvoří mělkou kopii aktuálního Objectsouboru . (Zděděno od Object) |
ToString() |
Vrátí řetězec, který představuje aktuální objekt. (Zděděno od Object) |
TryBinaryOperation(BinaryOperationBinder, Object, Object) |
Poskytuje implementaci pro binární operace. Třídy odvozené z DynamicObject třídy mohou přepsat tuto metodu k určení dynamického chování pro operace, jako je sčítání a násobení. |
TryConvert(ConvertBinder, Object) |
Poskytuje implementaci pro operace převodu typů. Třídy odvozené z DynamicObject třídy mohou přepsat tuto metodu a určit dynamické chování pro operace, které převádějí objekt z jednoho typu na jiný. |
TryCreateInstance(CreateInstanceBinder, Object[], Object) |
Poskytuje implementaci pro operace, které inicializují novou instanci dynamického objektu. Tato metoda není určena pro použití v jazyce C# nebo Visual Basic. |
TryDeleteIndex(DeleteIndexBinder, Object[]) |
Poskytuje implementaci pro operace, které odstraňují objekt podle indexu. Tato metoda není určena pro použití v jazyce C# nebo Visual Basic. |
TryDeleteMember(DeleteMemberBinder) |
Poskytuje implementaci pro operace, které odstraňí člena objektu. Tato metoda není určena pro použití v jazyce C# nebo Visual Basic. |
TryGetIndex(GetIndexBinder, Object[], Object) |
Poskytuje implementaci pro operace, které získají hodnotu podle indexu. Třídy odvozené z DynamicObject třídy mohou přepsat tuto metodu k určení dynamického chování pro operace indexování. |
TryGetMember(GetMemberBinder, Object) |
Poskytuje implementaci pro operace, které získávají členské hodnoty. Třídy odvozené z DynamicObject třídy mohou přepsat tuto metodu k určení dynamického chování pro operace, jako je získání hodnoty pro vlastnost. |
TryInvoke(InvokeBinder, Object[], Object) |
Poskytuje implementaci pro operace, které vyvolávají objekt. Třídy odvozené z DynamicObject třídy mohou přepsat tuto metodu k určení dynamického chování pro operace, jako je vyvolání objektu nebo delegáta. |
TryInvokeMember(InvokeMemberBinder, Object[], Object) |
Poskytuje implementaci pro operace, které volají člena. Třídy odvozené z DynamicObject třídy mohou přepsat tuto metodu k určení dynamického chování pro operace, jako je volání metody. |
TrySetIndex(SetIndexBinder, Object[], Object) |
Poskytuje implementaci pro operace, které nastavují hodnotu podle indexu. Třídy odvozené z DynamicObject třídy mohou přepsat tuto metodu k určení dynamického chování pro operace, které přistupují k objektům pomocí zadaného indexu. |
TrySetMember(SetMemberBinder, Object) |
Poskytuje implementaci pro operace, které nastavily členské hodnoty. Třídy odvozené z DynamicObject třídy mohou přepsat tuto metodu k určení dynamického chování pro operace, jako je nastavení hodnoty vlastnosti. |
TryUnaryOperation(UnaryOperationBinder, Object) |
Poskytuje implementaci pro unární operace. Třídy odvozené z DynamicObject třídy mohou přepsat tuto metodu k určení dynamického chování pro operace, jako je negace, inkrementace nebo dekrementace. |