Ajouter des propriétés à une classe dynamiquement C#
Je veux ajouter des propriétés à une classe dynamiquement et de définir des valeurs. Quelqu'un pourrait-il m'indiquer la bonne direction à des tutoriels ou des articles, ou encore mieux, de fournir un exemple.
J'ai une classe de base qui est appelée dans une boucle foreach. À l'intérieur de cette classe, j'ai besoin d'ajouter jusqu'à 30 propriétés et valeurs de réglage.
C'est la méthode qui appelle la classe.
foreach (Class name in this.list)
{
ClassBeingCalled class = new ClassBeingCalled (name);
class.Populate();
this.newlist.Add(class);
}
Maintenant à l'intérieur de la classe qui est appelée, j'ai besoin de créer les 30 ou alors des propriétés à la volée, ce qui sera défini dans la "Remplir" la méthode de cette classe.
Comme si...
foreach (PropertyToAssign count2 in listofproperties)
{
string name = "_nameofproperty" + count2.name
base.GetType().GetField(name, BindingFlags.NonPublic |
BindingFlags.Instance).SetValue(this, count2);
}
Quoi de mal avec juste l'aide de 'listofproperties" plutôt que d'essayer de créer des propriétés dynamiques? Si elle doit être Dynamique, avoir un coup d'oeil à msdn.microsoft.com/en-us/library/vstudio/dd264741.aspx
Comment voulez-vous dire?
Faire ces choses existe en tant que propriétés? c'est à dire que vous essayez de créer propriétés? ou attribuer des valeurs aux propriétés existantes?
Je pense que tu devrais peut-être envisager à l'aide d'un dictionnaire interne avec un indexeur, de sorte que vous vous accéder à vos propriétés, comme
Btw, dans le titre, il dit: "les Biens", mais dans remplir méthode qu'il reflète "Champs"
Comment voulez-vous dire?
Faire ces choses existe en tant que propriétés? c'est à dire que vous essayez de créer propriétés? ou attribuer des valeurs aux propriétés existantes?
Je pense que tu devrais peut-être envisager à l'aide d'un dictionnaire interne avec un indexeur, de sorte que vous vous accéder à vos propriétés, comme
myObject["PropertyName"]
(vous pouvez réaliser effectivement la même chose avec un ExpandObject).Btw, dans le titre, il dit: "les Biens", mais dans remplir méthode qu'il reflète "Champs"
OriginalL'auteur Pavan Dhariwal | 2013-05-16
Vous devez vous connecter pour publier un commentaire.
Il ya quelques façons d'aborder cette.
a) Vous pouvez utiliser la réflexion pour générer une classe à l'exécution avec tout ce dont vous avez besoin. Vous pouvez toujours dériver cette classe générée à partir d'une classe de base qui contient
Populate
mais je ne vois pas la nécessité.b) Si vous êtes à l'aide de C# 4.0+, vous pouvez utiliser
ExpandoObject
, qui vous permet de définir quelles que soient les propriétés que vous voulez pour vos besoins. Notez que ce sont des pas ajoutées en soi, car il utilise le DLR qui est tous d'exécution. En fonction de vos besoins, cela peut être très bien; c'est à peu près la même que l'approche de c, mais à l'aide de la DLR.c) Vous pouvez utiliser une sauvegarde de dictionnaire et l'utilisation d'un indexeur, comme suit:
En utilisant l'approche 3, vous êtes en fait de l'indexation basée sur
string
s qui est probablement mieux en fonction de vos besoins... Que vous pouvez faire quelque chose le long des lignes de ce:À la fin de la journée, il est probablement mieux si vous expliquer le problème que vous essayez de résoudre, il y a peut-être une meilleure façon de l'aborder entièrement.
Vous avez proposé votre déjà existant de la solution de définition des propriétés d'une classe et nous a dit que vous avez besoin pour ajouter des propriétés. En réalité, vous devriez probablement regarder dans l'option c ici (aussi été suggéré par d'autres dans cette question) et au lieu de la définition de la propriété, il suffit de régler la valeur sur le dictionnaire interne.
Comment pourrais-je définir le type de propriété dans le dictionnaire?
Eh bien, vous n'avez pas. Vous utilisez
object
de sorte que vous pouvez tenir quelque chose là-dedans. Si vous avez seulement 1 type de données que vous pouvez toujours changerobject
àstring
, ou quoi que ce type est une.Salut Rudi, j'obtiens l'erreur suivante: Impossible d'appliquer l'indexation [] à une expression du type " BusinessLogic.InvoiceBaseUIBindable' Après j'ai ajouté ce - ce que[nom] = count2.valeur;
OriginalL'auteur Rudi Visser
Il n'est pas possible d'ajouter des propriétés dynamiques d'une classe compilée à la volée. Vous pouvez uniquement ajouter des propriétés dynamiques de classes lors de la construction de la classe elle-même à la volée à l'aide de De la réflexion.Émettre
Votre autre option pourrait être l'aide d'un Dictionnaire ou ExpandoObject (qui est en fait un dictionnaire). Mais pour que cette option, vous ne pouvez pas accéder à vos propriétés dynamiques à l'aide de la réflexion.
OriginalL'auteur Mehmet Ataş