Quel est le meilleur moyen de résoudre em> le problème em>? Vous voyez que c'est assez compliqué pour obtenir la propriété autocompletemode . Vous pouvez supposer qu'il est garanti que j'ai une combinaison de ComboBox ou une zone de texte. P> Ma première idée était d'utiliser générique avec plusieurs types pour t em>, mais il semble que cela soit Pas possible dans .NET: P> public string GetAutoCompleteModeProperty<T>(T control) where T: ComboBox, TextBox // this does not work, of course
3 Réponses :
dynamic currentControl = control; string text = currentControl.WhatEver; But, it throws an exception (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException) if currentControl doesn't have WhatEver property
Cela fonctionne bien et semble être ma solution préférée. Merci.
Je ne pense pas que vous devriez utiliser le mot-clé code> dynamique code> dans de telles situations - Voir cette question
Downvote parce que @philippm a raison. L'utilisation de dynamique ici est sujette d'erreur et il y a beaucoup de meilleures façons d'y aller.
dépend de ce que vous essayez d'atteindre. Si vous êtes juste intéressé par la propriété de texte, cela est réellement hérité de la contrôle classe - Par conséquent, vous n'avez pas besoin de lancer l'objet. Donc, vous avez juste besoin de: Si, toutefois, vous avez besoin de logique plus compliquée, vous devez envisager de repenser votre flux de contrôle. Je suggérerais un modèle de vue / présentateur et gérer chaque événement individuellement - l'approche de la responsabilité unique peut réduire considérablement la complexité. p> Si vous affectez votre affichage une interface avec les propriétés attendues - par ex. View.firstName, vue.HouseName ou vue.countryselection - de cette façon la mise en œuvre (c'est-à-dire la zone de texte, comboquox, etc.) est cachée. Ainsi: P> public interface IMyView
{
string FirstName { get; }
string HouseName { get;}
string CountrySelection { get; }
}
public class MyView : Form, IMyView
{
public string FirstName { get { return this.FirstName.Text; } } // Textbox
public string HouseName { get { return this.HouseName.Text; } } // Textbox
public string CountrySelection { get { return this.CountryList.Text; } // Combobox
}
contrôler.text code> n'existe que dans la bibliothèque WinForms. Il s'agit d'une faille de conception, car toutes les commandes ne sont pas significatives de la propriété de texte code>. system.windows.controls.control code> (la version WPF) n'a pas cette propriété commune.
Utiliser type.getType () code>. Il vous suffit de saisir une version code> de la version code> de votre propriété dans. var property = t.GetProperty("AutoCompleteMode");
if (property == null)
{
//Do whatever you need to do
}
Semble être une belle solution ici qui fonctionne aussi. Dans mon cas, c'est trop surhad depuis que j'essaie de faire du développement rapide. Pour cette raison, je préfère personnellement la solution de Badgan M. M. M. Merci une tonne quand même!
@Thewonned longueur Vous devez envisager une gestion des exceptions, ce code est plus facile à maintenir, car nous savons si la propriété existe ou non. Avec dynamique, il obtient la propriété à l'heure d'exécution et il n'y a aucun moyen de vérifier si vous ne l'enveloppez pas dans une prise d'essai. Les frais généraux de ce n'est vraiment pas si beaucoup :)
@Thewwonnet longueur si la compréhension de c'est ce que vous avez du mal, je peux expliquer davantage :)
Eh bien, tu as raison. Il est même "plus rapide" (en signification de la frappe du code) pour utiliser votre solution car je peux manquer le bloc d'essai. Merci! Aucune explication nécessaire, je pense que je l'ai eu;)
La propriété de texte est-elle la seule chose que vous suivez?
Non, c'était censé être une question plus générale. Ce n'était qu'un exemple minimisé. J'utilise également l'autocomplete * -Properties. (J'ajoute cela à la question maintenant)
Vous n'avez pas besoin de l'extérieur si vous le faites? Si
contrôlombobox code> est null, il n'est pas une combinaison de combat, etc.Oui vous avez raison. Je n'ai ajouté que ceci pour préciser qu'il est garanti que j'ai une combinaison de combat ou une zone de texte.
Quelle est la version .NET? Mot-clé dynamique pourrait aider
Vous voudrez peut-être mettre à jour votre exemple de code avec l'obtention des propriétés autocomplètes- * aussi - beaucoup de personnes se concentrent sur la propriété de texte comme la seule chose que vous voulez, malgré votre modification :)
Corrigé que dans le post principal.