Collection de types génériques
Si j'ai une classe générique:
public class MyClass<T>
{
public T Value;
}
Je veux instancier plusieurs éléments tels que...
new MyClass<string>
new MyClass<int>
...et de les ajouter à une collection. Comment puis-je définir la collection de sorte qu'il peut contenir une liste de types génériques? Je veux parcourir la collection à un certain point, et l'utilisation de la Valeur de la propriété. Possible?
- Comment avez-vous déclarer votre classe? Comment avez-vous défini la sauvegarde de la collection?
- est-ce juste un "hypothétique", ou quelque chose que vous essayez d'utiliser comme partie de la solution? Je demande parce que, étant donné un peu plus de contexte, nous pourrions être en mesure de proposer une meilleure réponse.. 🙂
- À peu près la même question a été republié plus tard (j'ai voté pour le fermer, mais pourrait ne pas le faire, car il est si vieux): stackoverflow.com/q/3777057/590790
Vous devez vous connecter pour publier un commentaire.
Votre classe générique hériter d'un non-générique de base, ou de mettre en œuvre un non-interface générique. Ensuite, vous pouvez disposer d'une collection de ce type et coulé dans le code que vous utilisez pour accéder à la collection du contenu.
Voici un exemple.
dynamic
mot-clé: msdn.microsoft.com/en-us/library/dd264736.aspxMyClass<string>
s'.La seule façon que je peux penser, sur le dessus de ma tête est comme suit (enveloppé dans une application Console pour les tests):
c'est à dire MyClass mettre en œuvre une interface vide et ensuite créer vos collections comme celui qui détient des instances de classes qui implémentent cette interface.
Mise à jour:
J'ai ajouté un "GetValue" méthode de l'interface qui vous permet d'accéder à la "Valeur" de l'instance de Maclasse comme un Objet. C'est à peu près aussi bon qu'il va obtenir, autant que je sache, si vous voulez avoir une collection qui contient les types mixtes.
object
et la version générique remplace typewise?.J'ai interfaces sur la plupart de mes types génériques avec "Non typé" les membres:
Vous pourriez aussi le faire par l'utilisation explicite de l'implémentation de l'interface, mais à mon avis, il est beaucoup plus facile en utilisant un autre nom. (Il y a quelques CA conseils sur l'implémentation d'interface explicite ainsi)
Vous aurez envie de définir une classe de base pour MyClass, vos collections seront une Liste de la classe de base. Ex:
Vous voulez avoir une collection de MyClass pour laquelle la valeur du paramètre de type T est différent dans chaque cas. Ce n'est pas possible .NET; il manque l'équivalent de la Java génériques (?). Ce que vous devez faire à la place est de créer un non-générique de base de la classe ou de l'interface, qui MyClass peut mettre en œuvre. Par exemple:
Je pense que le problème ici est que les classes génériques ne sont pas vraiment du même type à tous. Ils sont tout simplement des modèles qui créer ensemble de nouveaux types à la compilation (si j'ai bien compris). Par conséquent,
MyClass<int>
etMyClass<string>
sont complètement types différents, selon le moment de l'exécution. Ils pourraient aussi bien êtreMyIntClass
etMyStringClass
, qui ne peut bien évidemment pas avoir, dans la même liste, sans la boxe en premier. Ils ne sont pas (nécessairement) héritent de la même classe de base, de mettre en œuvre les mêmes interfaces, ou quoi que ce soit d'autre. Ils sont aussi différents que les deux autres types de là-bas, et vous devez les traiter en tant que tel (même si vous pensez que vous savez mieux).Bien sûr, vous pouvez implémenter une interface, hériter d'un objet de base, ou l'une des autres options déjà donné. Jetez un oeil à commongenius réponse pour une bonne manière de le faire.
Depuis .Net 3 il y a eu un CompositeCollection classe qui permet à de multiples objets uniques ou même des collections pour être contenues à l'intérieur. Il est utilisé par les développeurs WPF pour stocker et afficher les différents éléments dans le code Xaml. Mais cela ne signifie pas qu'il ne peut pas être utilisé en WPF situations.
Voici un exemple où je stocke des choses différentes à partir de chaînes pour les décimales et les extraire et de les énumérer sur tous les articles, alors les éléments d'un type spécifique:
Je crois que votre collection devraient tous être du même type Maclasse (comme en T devrait être la même), parce que le compilateur ne sait pas quels types vous avais ajouté des éléments dans la collection.
En d'autres termes, si vous ajoutez des 2 éléments d'une liste:
alors essayez de faire référence à l'un:
Le compilateur ne sait pas ce générique a été attribué à la MyClass liste de l'élément Un, parce que les éléments sont ajoutés au moment de l'exécution, mais les génériques sont déterminés au moment de la compilation.
Je suis assez sûr que ce que vous voulez faire ne peut pas être fait.
Si vous connaissez le nombre d'éléments à l'avance, vous pourriez peut-être utiliser un Tuple?
IList
Il n'est pas possible de définir une collection générique qui peut accepter toute la saveur de votre classe générique... c'est à dire
IList<MyClass>
. Les classes génériques ne sont une coupe courte pour le développeur de les enregistrer sur l'écriture d'un tas de code répétitif, mais au moment de la compilation de chaque saveur de la classe générique est traduit dans les faits. c'est à dire si vous avezMyClass<string>
,MyClass<int>
,MyClass<bool>
puis le compilateur va générer 3 séparées et distinctes des classes. La seule façon de faire ce que vous voulez est d'avoir une interface pour votre générique.et alors vous pouvez dire