Maison >développement back-end >C++ >Comment ajouter dynamiquement des propriétés C# au moment de l'exécution sans utiliser de collections ?

Comment ajouter dynamiquement des propriétés C# au moment de l'exécution sans utiliser de collections ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-02 21:12:40408parcourir

How to Dynamically Add C# Properties at Runtime Without Using Collections?

Ajouter dynamiquement des propriétés C# au moment de l'exécution sans utiliser de collections

Envisagez un scénario dans lequel vous devez créer un objet dynamique avec des propriétés qui peuvent être ajoutées dynamiquement au moment de l'exécution. Au lieu d'utiliser un dictionnaire ou une collection de paramètres, vous pouvez exploiter la classe ExpandoObject.

ExpandoObject

ExpandoObject vous permet d'ajouter et de supprimer des membres de ses instances au moment de l'exécution, permettant des capacités de liaison dynamique. Il fournit un moyen pratique de manipuler les propriétés de manière dynamique, comme le montre l'exemple suivant :

dynamic dynObject = new ExpandoObject();
dynObject.SomeDynamicProperty = "Hello!";

Objet dynamique personnalisé

En vous basant sur l'approche ExpandoObject, vous pouvez créer un objet dynamique personnalisé qui gère la récupération et la définition des propriétés dynamiques. Le code suivant illustre ce concept :

public static dynamic GetDynamicObject(Dictionary<string, object> properties)
{
    return new MyDynObject(properties);
}

public sealed class MyDynObject : DynamicObject
{
    private readonly Dictionary<string, object> _properties;

    public MyDynObject(Dictionary<string, object> properties)
    {
        _properties = properties;
    }

    public override IEnumerable<string> GetDynamicMemberNames()
    {
        return _properties.Keys;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        if (_properties.ContainsKey(binder.Name))
        {
            result = _properties[binder.Name];
            return true;
        }
        else
        {
            result = null;
            return false;
        }
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        if (_properties.ContainsKey(binder.Name))
        {
            _properties[binder.Name] = value;
            return true;
        }
        else
        {
            return false;
        }
    }
}

En implémentant l'interface DynamicObject, vous obtenez un contrôle total sur le mécanisme d'accès aux membres dynamiques. Cela vous permet d'implémenter des règles et des comportements personnalisés pour votre objet dynamique.

Utilisation

Une fois votre objet dynamique personnalisé en place, vous pouvez ajouter des propriétés et les récupérer au moment de l'exécution. :

var dyn = GetDynamicObject(new Dictionary<string, object>
{
    { "prop1", 12 },
});

Console.WriteLine(dyn.prop1);
dyn.prop1 = 150;

Remarque :

Les objets dynamiques sont puissants mais doivent être utilisé avec prudence. Le compilateur ne peut pas vérifier les appels dynamiques et vous risquez de rencontrer des erreurs d'exécution si vous ne faites pas attention. Il est crucial de comprendre les mécanismes sous-jacents et les problèmes potentiels avant de les utiliser dans le code de production.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn