51 votes

Ajout de propriétés inconnues (au moment de la conception) à un ExpandoObject

tout simplement d'explorer c# 4. Essayer d'obtenir ma tête autour de toute cette dynamique des choses. Désolé si cette question est stupide, pas d'expérience dans ce domaine.

Si j'ai un ExpandoObject et souhaitez ajouter des propriétés publiques (avec get et set) au moment de l'exécution, comment pourrais-je aller sur le faire?

Par exemple, j'ai un documentTemplate et d'un document, qui a une propriété pointant vers le documentTemplate. Cette documentTemplate a eu quelques Titres d'étiquettes (par exemple. Compétences développées chez les élèves), qui doivent être traitées tout en rendant le document (par exemple. La Concentration, la mémoire, etc.). Donc dès que le modèle est défini dans le document, je veux créer une classe qui possède des propriétés ayant le même nom que la balise de titre dans le Modèle, puis à l'aide de certains élément de l'INTERFACE utilisateur, tels que la grille de propriété, je peux l'avoir à l'utilisateur de remplir les valeurs de balise à l'encontre de la balise de Titre.

Merci pour la lecture!

101voto

Paul Sasik Points 37766

Je me suis demandé comment il serait possible d'ajouter des membres à une classe "à la volée" et ai eu cet exemple:

 using System;
using System.Collections.Generic;
using System.Dynamic;

class Program
{
    static void Main()
    {
        dynamic expando = new ExpandoObject();
        var p = expando as IDictionary<String, object>;

        p["A"] = "New val 1";
        p["B"] = "New val 2";

        Console.WriteLine(expando.A);
        Console.WriteLine(expando.B);
    }
}
 

L'intérêt de cet extrait de code est que les membres A et B sont définis en tant que littéraux de chaîne (codés en dur / stringifiés) dans et ajoutés via l'interface IDictionary de ExpandoObject. Nous testons l'existence et les valeurs des clés (et prouvons le concept) en y accédant directement et en les affichant sur la console.

4voto

Stephen Cleary Points 91731

Il est possible d’ajouter des propriétés de délégué à un ExpandoObject , qui agit alors (presque) comme des méthodes. par exemple,

 dynamic obj = new ExpandoObject();
obj.GetDocumentTemplate = () => { ... };
...
obj.GetDocumentTemplate(); // invokes delegate
 

3voto

Hans Passant Points 475940

Oui, ExpandoObject est très conçu pour ajouter dynamiquement des propriétés à un "sac de propriétés". L'idée de donner à une telle propriété un getter et un setter n'est toutefois pas supportée. C'est peut-être clair si vous y réfléchissez un peu: ce ne serait plus une propriété dynamique si vous savez déjà ce que le getter et le setter doivent faire. Le plus près que vous puissiez obtenir est de mettre en œuvre l'événement INotifyPropertyChanged afin de pouvoir détecter les modifications. Quelques exemples de code:

 using System;
using System.Dynamic;
using System.ComponentModel;

class Program {
  static void Main(string[] args) {
    dynamic obj = new ExpandoObject();
    obj.test = 42;     // Add a property
    Console.WriteLine(obj.test);

    var inpc = (INotifyPropertyChanged)obj;
    inpc.PropertyChanged += inpc_PropertyChanged;
    obj.test = "foo";
    Console.ReadLine();
  }

  static void inpc_PropertyChanged(object sender, PropertyChangedEventArgs e) {
    Console.WriteLine("'{0}' property changed", e.PropertyName);
  }

}
 

3voto

Alex Maker Points 483

Je viens de découvrir ce fait intéressant: les liaisons XAML à un ExpandoObject créeront également les propriétés auxquelles la liaison tente d'accéder .

J'ai encore besoin de plus de créativité pour découvrir ce que cela pourrait être bon. Création d'objet dynamique sur l'interface utilisateur? ça a l'air cool: je vais essayer quelque chose.

2voto

Yoopergeek Points 2875

Jusqu'à présent, les réponses couvrent assez bien les bases, mais je pensais que cet article valait également la peine d'être partagé:

http://msdn.microsoft.com/en-us/magazine/ff796227.aspx

Il couvre quelques exemples d'utilisation de l'entrée XML dynamique pour créer et utiliser ExpandoObjects de manière dynamique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X