il suffit d'explorer C # 4. Essayer d'avoir la tête autour de toutes ces choses dynamiques. Désolé si cette question est idiote, aucune expérience dans ce domaine.
Si j'ai un expandoObject et que je souhaite ajouter des propriétés publiques (avec GET et SET) au moment de l'exécution, comment vais-je y aller?
Par exemple, j'ai un document de documentation et un document, qui a une propriété indiquant la documentation du document. Ce document DocumentTemplate a des titres de tags (par exemple, des capacités développées entre les étudiants), qui devraient être adressées lors de la prise du document (par exemple, une concentration, une mémoire, etc.). Donc, dès que le modèle est défini dans le document, je souhaite créer une classe, qui possède des propriétés avec les mêmes noms que les titres de tags dans le modèle, puis à l'aide de certains éléments de l'interface utilisateur, tels que la propriétéGratie, je peux avoir l'utilisateur Remplissez les valeurs de balise sur les titres de tag.
Merci d'avoir lu!
Je me demandais comment il pourrait être possible d'ajouter des membres à une classe "à la volée" et proposé cet échantillon:
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);
}
}
Le but de cet extrait de code est que les éléments A et B sont définis comme des chaînes littérales (codé/dur de chaîne de caractères) et ajouté par l'intermédiaire de l'interface IDictionary de ExpandoObject. Nous testons l'existence et les valeurs des clés (et prouvons le concept) en leur accédant directement et que la sortie de la console.
Il est possible d'ajouter des propriétés déléguées à un ExpandoObject
, qui agissent ensuite (presque) comme des méthodes. par exemple.,
dynamic obj = new ExpandoObject();
obj.GetDocumentTemplate = () => { ... };
...
obj.GetDocumentTemplate(); // invokes delegate
Oui, WeandoObject est très conçu pour ajouter de manière dynamique des propriétés à un "sac de propriété". La notion de donner une telle propriété un getter et un setter n'est pas prise en charge. Peut-être que c'est 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 devraient faire. Le plus proche que vous puissiez obtenir est de mettre en œuvre l'événement inotifypropertychanged afin que vous puissiez détecter des modifications. Quelques échantillons 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);
}
}
Les réponses couvrent jusqu'à présent les bases très bien, mais j'ai estimé que cet article de MSDN Magazine valait la peine d'être partagé également:
http://msdn.microsoft.com/en-us/magazine/ff796227.aspx
Il couvre quelques exemples d'une entrée XML dynamique pour créer et utiliser de manière dynamique expresoObjects.
Je viens de découvrir ce fait intéressant: Les liaisons XAML à un expresoObject créeront également les propriétés que la liaison tente d'accéder.
J'ai encore besoin de plus de créativité pour savoir ce que cela pourrait être bon. Création d'objet dynamique sur l'interface utilisateur? On dirait que je vais essayer quelque chose.