6
votes

Est-il possible d'utiliser une liste de génériques non typés dans C #?

J'essaie la conception suivante sans succès:

abstract class Foo<T>
{
    abstract T Output { get; }
}

class Bar
{
    List<Foo> Foos;
}


1 commentaires

Dupliqué exact:


3 Réponses :


0
votes

Liste n'est pas valide car foo est un modèle et nécessite une classe spécifiée, même si c'est un générique lui-même ( Liste > ).


1 commentaires

Ce serait ça. Faire une barre générique (le paramètre Type peut être aussi, ou u, ou autre) et utilisez le paramètre Type pour garder FOO Open. Vous pouvez le faire aussi loin dans la hiérarchie du conteneur que vous avez le contrôle; Cependant, à un moment donné, vous devrez fermer la mise en œuvre générique avec un type concret afin de consommer la classe (ES). Si vous souhaitez le faire de manière dynamique, vous pouvez utiliser la réflexion pour instancier un objet générique fermé à un type identifié par un objet de type ou une chaîne, mais cela peut être rapide rapidement rapidement.



0
votes

Non, vous ne pouvez pas utiliser de générique de telle de manière. Vous avez besoin d'ajouter un paramètre de type générique sur BAR et de l'envoyer à FOO ou fournissez une instance fermée de FOO le type type .

Exemple de la première xxx


4 commentaires

Je pense qu'il sait que. Ce n'est pas ce qu'il voulait dire.


@Timwi, alors l'OP devrait être plus clair dans la question. Face à une question ambiguë, il est très facile de donner une réponse incorrecte. Le bowvote pour moi et d'autres est injustifié. Par votre logique, je devrais vous indiquer pour avoir une interprétation différente de moi.


Je suis d'accord, je trouve aussi des questions ambiguës aussi gênantes. Il est trop facile de supposer que sa propre interprétation a raison - désolé pour ça! (Bien sûr, cela aiderait si @lazlo a jeté une lumière sur cette ...) (Gamezelda semble être d'accord avec moi, bien que :))


Désolé d'être incertain, même si je ne peux pas interpréter pourquoi JaredPar aurait pu penser que je devais le savoir. Ma question est en effet comment Timwi l'a interprété.



8
votes

Si je vous comprends correctement, vous souhaitez une liste des objets code> FOO code> qui ont des types différents de la sortie code> s, non? Étant donné que ces sorties sont de types différents, vous devrez utiliser des cases de toute façon.

Cependant, l'idée suivante pourrait aider. Que diriez-vous de déclarer une interface non générique appelée ifoo code>: ¹ p> xxx pré>

puis mettez-la dans votre classe abstraite: p>

// Type ‘IEnumerable<string>’ (rather than ‘IEnumerable<object>’)!
var stringFoos = Foos.OfType<Foo<string>>().Select(f => f.Output);


1 commentaires

Merci. :) exactement ce que je cherchais.