[c#] Différences entre ExpandoObject, DynamicObject et dynamique



Answers

Selon la spécification de langage C #, la dynamic est une déclaration de type. Ie dynamic x signifie que la variable x a le type dynamic .

DynamicObject est un type qui facilite l'implémentation de IDynamicMetaObjectProvider et donc remplace le comportement de liaison spécifique pour le type.

ExpandoObject est un type qui agit comme un sac de propriétés. C'est-à-dire que vous pouvez ajouter des propriétés, des méthodes, etc. aux instances dynamiques de ce type lors de l'exécution.

Question

Quelles sont les différences entre System.Dynamic.ExpandoObject , System.Dynamic.DynamicObject et dynamic ?

Dans quelles situations utilisez-vous ces types?




L'exemple ci-dessus de DynamicObject ne dit pas clairement la différence, car il implémente fondamentalement la fonctionnalité qui est déjà fournie par ExpandoObject .

Dans les deux liens mentionnés ci-dessous, il est très clair qu'à l'aide de DynamicObject , il est possible de conserver / changer le type réel ( XElement dans l'exemple utilisé dans les liens ci-dessous) et de mieux contrôler les propriétés et méthodes.

blogs.msdn.microsoft.com/csharpfaq/2009/09/30/…

blogs.msdn.microsoft.com/csharpfaq/2009/10/19/…

public class DynamicXMLNode : DynamicObject

{

    XElement node;

    public DynamicXMLNode(XElement node)

    {

        this.node = node;

    }

    public DynamicXMLNode()

    {

    }

    public DynamicXMLNode(String name)

    {

        node = new XElement(name);

    }

    public override bool TrySetMember(

        SetMemberBinder binder, object value)

    {

        XElement setNode = node.Element(binder.Name);

        if (setNode != null)

            setNode.SetValue(value);

        else

        {

            if (value.GetType() == typeof(DynamicXMLNode))

                node.Add(new XElement(binder.Name));

            else

                node.Add(new XElement(binder.Name, value));

        }

        return true;

    }

    public override bool TryGetMember(
        GetMemberBinder binder, out object result)

    {

        XElement getNode = node.Element(binder.Name);

        if (getNode != null)

        {

            result = new DynamicXMLNode(getNode);

            return true;

        }

        else

        {

            result = null;

            return false;

        }

    }

}



Links