J'ai essayé de rechercher une réponse à ce problème mais je n'ai pas pu trouver beaucoup, probablement parce que je ne sais pas comment le chercher correctement, alors cela va ici. Toute aide est très appréciée.
avec la classe de base qui ressemble à p> et de classes dérivées qui ressemblent à p> Pendant l'exécution, la fonction reçoit une collection d'objets "propriété". Que dois-je faire pour pouvoir obtenir la "valeur" de chacun? Dois-je avoir un gros J'ai essayé de définir une propriété abstraite "valeur" à remplacer mais que les types de retour sont différents, cela n'a pas fonctionné. J'ai aussi essayé de jouer avec l'observation de la propriété "valeur", mais je ne pouvais pas le faire fonctionner. L'idée d'utiliser une variante de type COM ne sonne pas très appropriée, non plus. P> Merci beaucoup à l'avance. P> EDIT: P> J'aurais dû ajouter Détails sur ce que j'essaie de faire. Les propriétés sont affichées dans une application WinForms. Différentes "Textbox" es représentent différentes propriétés et sont filtrées pour une entrée correcte (selon le type). Les valeurs actualisées sont relues et stockées. L'objet conteneur sera sérialisé dans JSON et désérialisé sur un client Android et iPhone et, éventuellement, ces valeurs seront transmises à un calque exécutant le code natif C ++ faisant des trucs opengl. Je ne sais pas à l'avance le type de toutes les propriétés nécessaires pour que le Middleman, je voulais rendre mon code aussi robuste que possible tout en pouvant alimenter le moteur OpenGL. P> P> si code> instruction pour interroger le type d'objet "propriété"? Sinon, y a-t-il une solution plus élégante? P>
4 Réponses :
Vous pouvez utiliser une classe générique:
public static Property<T> AsProp<T>(this T value, string name) { return new Property<T>(name,value); } var intProp = 32.AsProp("age"); var strProp = "Earl".AsProp("name"); var enumProp = ColorEnum.Magenta.AsProp("eye color");
La méthode makeproperty code> doit-elle être statique?
@Otiel: Non, pas pour une raison particulière. (Honnêtement, cela dépend de l'endroit où vous voulez le définir / l'utiliser). Cela peut être statique cependant, donc je modifierai le code pour réfléchir cela.
+1. Merci beaucoup d'avoir pris le temps de fournir une réponse élégante. Mon cas était davantage sur l'interaction de l'interface utilisateur et la structure des propriétés et la réponse de MiniTech m'a donné la direction à parcourir. En suivant les étapes suivantes, je vais inspecter votre réponse plus en détail et incorporerez les idées au fur et à mesure de leur intégration dans notre cas.
Vous devriez simplement utiliser le type code> objet code>. Qu'est-ce que vous essayez d'accomplir? Le problème ici n'est pas la structure de vos classes, c'est la fonction qui reçoit la collecte des objets code> code>. Il est impossible de jeter quelque chose à un type inconnu, car vous ne savez pas quel type de variable doit être stocké. P>
Si fondamentalement, votre propriété Property.Value (code> doit être de type
objet code>. Dans votre méthode qui utilise les objets code> code>, vous devez faire quelque chose avec eux et ce que vous décidez décidera de la structure de la structure. Imprimez-vous des valeurs? Avoir une valeur code> * de la valeur code> hériter d'un abstrait
PropertyValue CODE> Classe et remplacement
Tostring () Code> Pour renvoyer une catégorie appropriée. P>
Microsoft utilise cette technique très technique dans la SSIS variable < / a> classe.
@Alokoko: Dans ce cas, vos classes devraient gérer leur propre écran. Avoir une méthode Control FETCHCONTROL () CODE> et une méthode
VOID ApplyChanges (contrôle C) CODE> (par exemple, la flexibilité de Nommage) et la classe crée son propre contrôle. Ensuite, la méthode peut placer la commande (probablement une zone de texte code>) sur le formulaire, et lorsque l'édition est effectuée,
ApplyChanges code> peut être transmis le contrôle et les modifications appliquées.
Oui, cette approche a bien fonctionné. Merci de me sortir rapidement!
J'ai fait quelques modifications à votre code d'échantillon et j'ai obtenu ce résultat ...
abstract public class Property { private readonly String _name; public Property(String propertyName) { _name = propertyName; } public String Name { get { return _name; } } abstract public override String ToString(); } public class StringProperty : Property { private readonly dynamic _value; // different properties for different types public StringProperty(String propertyName, dynamic value) : base(propertyName) { this._value = value; } public dynamic Value // different signature for different properties { get { return _value; } } public override String ToString() { return base.Name + ": " + _value; } } static void Main(string[] args) { StringProperty sp = new StringProperty("A double", 3.444); StringProperty sp2 = new StringProperty("My int", 4343); StringProperty sp3 = new StringProperty("My directory", new DirectoryInfo("Some directory")); StringProperty sp4 = new StringProperty("My null", null); Console.WriteLine(sp); Console.WriteLine(sp2); Console.WriteLine(sp3); Console.WriteLine(sp4); } }
Pourquoi "dynamique" est-il meilleur que "objet" dans ce cas?
À zmbq. Ce n'est peut-être pas, je ne sais pas assez sur le cas. Toutefois, à un moment donné à l'aide de l'objet, vous utiliserez des mises à jour explicites. Les résultats pourraient donc être tout à fait si (int) «10» par exemple. Cela signifie que vous finissez par faire de plus en plus d'échafaudages pour faire face à ne pas savoir quel type de votre propriété devrait être et vous devez ajouter plus d'échafaudages pour chaque nouveau type. Dynamic résout cela, mais vous donne d'autres problèmes. C'est un choix de conception, je dois le regarder et voir où est le plus pratique de compromettre.
Cela nécessiterait un peu de repenser, mais avez-vous envisagé d'utiliser le type dynamique (introduit dans .NET4)
ne résolvez pas vraiment votre problème, mais la saisie. Vos propriétés peuvent simplement simplement être un P>
Dictionary<String, dynamic>
Wow, je n'ai jamais entendu parler de dynamique code>. Je suppose que cela n'existe pas dans vb.net 4.0. :( +1
Peu de fudge apparemment [link] Stackoverflow.com/Questtions/28899974/...
Merci de me laisser savoir sur le mot-clé "dynamique".
Mais c'est une variante bien sûr. Vous pouvez peindre un visage plus heureux C # - en l'offrant dynamique i>.
Qu'est-ce que vous avez l'intention de faire avec la valeur?
Ajouté plus de détails au texte de la question.