2009-02-10 7 views
4

J'ai hérité d'une base de code et j'écris un petit outil pour mettre à jour une base de données. Le code utilise une couche d'accès aux données telle que SubSonic (mais elle est développée localement). Il y a beaucoup de propriétés d'un objet, comme "id", "templateFROM" et "templateTO", mais il y en a 50.Obtention/définition dynamique d'une propriété d'un objet dans C# 2005

À l'écran, je ne peux pas afficher les 50 propriétés dans leur propre zone de texte pour la saisie de données, j'ai donc une liste de toutes les propriétés possibles, et une zone de texte pour l'édition. Lorsqu'ils choisissent une propriété dans la zone de liste, je remplis la zone de texte avec la valeur à laquelle correspond la propriété. Ensuite, j'ai besoin de mettre à jour la propriété après avoir terminé l'édition.

En ce moment j'utilise 2 énormes instructions de cas de commutateur. Cela me semble stupide. Y at-il un moyen de dire dynamiquement à C# quelle propriété je veux définir ou obtenir? Peut-être comme:

entObj."templateFROM" = _sVal; 

??

Répondre

8

Vous devez utiliser System.Reflection pour cette tâche.

entObj.GetType().GetProperty("templateFROM").SetValue(entObj, _sVal, null); 

Ceci devrait vous aider.

+0

Oui, il n'y a AUCUNE FAÇON que j'aurais deviné cette syntaxe. Merci beaucoup! –

1
PropertyInfo[] properties = typeof(YourClass).GetProperties(BindingFlags.Instance | BindingFlags.Public) 

vous pouvez lier ceci à votre liste déroulante, et plus tard:

PropertyInfo property = typeof(YourClass).GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Public) 
property.SetValue(class, textBox.Text, null); 
2

Je pense que ce que vous cherchez est la réflexion. Voici un petit extrait:

Type t = entObj.GetType(); 
t.GetProperty("templateFROM").SetValue(entObj, "new value", null); 

Sur plus d'une note de convivialité (et moins d'une note répondeur-votre-question), vous voudrez peut-être regarder dans un contrôle PropertyGrid. Cette listbox/textbox semble être assez fastidieuse à utiliser.

+0

Excellente suggestion sur le contrôle PropertyGrid - cependant, les éléments que nous modifions sont multilignes, et peuvent ne pas fonctionner très bien. Mais vous avez raison, cela deviendra fastidieux. J'espère que je vais avoir un flash. Tant pis. –

+0

+1 pour les informations PropertyGrid. Très intéressant! –

0

Cet exemple utile

public class aa 
{ 
    private string myVar; 

    public string value 
    { 
     get { return myVar; } 
     set { myVar = value; } 
    } 
} 



private void button1_Click(object sender, EventArgs e) 
    { 
     aa a1 = new aa(); 
     System.Reflection.PropertyInfo pt = typeof(aa).GetProperty("value"); 
     pt.SetValue(a1, "hi",null); 
     this.Text = a1.value; 
    } 
1

Sur le même sujet, vous êtes utilisateurs haine cette interface si elles ont besoin de mettre à jour un grand nombre de propriétés à la fois. Pouvez-vous diviser les propriétés en groupes ou en pages que l'utilisateur peut parcourir plus rapidement?

+0

Je suis d'accord, ils vont le détester. Cependant, nous essayons d'obtenir une démo rapide et sale à la porte. Nous avons environ 30 de ces champs, toujours les mêmes champs, et ils sont tous les champs où l'utilisateur va entrer un motif (y compris les retours chariot, donc multiligne) pour correspondre. –

+0

Une grille déroulante fonctionnerait également. Ensuite, il pourrait toujours être piloté par les données, permettre une entrée multi-ligne, et ne pas obliger vos utilisateurs à faire autant de navigation. –

Questions connexes