J'ai un ensemble de classes, chacun pouvant ouvrir différents types de fichiers à l'aide d'une application externe et indiquer cette application à imprimer le fichier à une imprimante particulière. Les classes ont tous hérité d'une classe abstraite commune et d'une interface. J'essaie de créer un dictionnaire code> des extensions de fichier imprimable et de type est là un moyen de faire mise à jour:
Je ne veux pas stocker des instances pour les deux raisons suivantes: p> correspondant code > S de classes pouvant imprimer de tels fichiers. Je fais pas strud> veulent instancier les classes du dictionnaire. P> dictionnaire
chaîne [] imprimableextensions code>). Le dictionnaire stocke des extensions comme des clés. Il n'y a pas d'utilitaire dans la création et le stockage de plusieurs séparations de la même classe. Li>
4 Réponses :
pas directement - rappelez-vous que les choses que vous mettez dans votre dictionnaire sont Probablement la meilleure option ici consiste à vérifier que chaque type que vous ajoutez à votre dictionnaire implémente type code> objets, pas d'objets qui implémentent iapplicationPinter code>. p>.
iipplicationPrinter code>, en vérifiant si type.geterface ("iapplicationPinter") code> retourne null ou pas. p>
Je pense qu'il est préférable d'éviter les chaînes au lieu de types dans la mesure du possible. Et c'est possible ici.
Vous avez raison - typeof (IAPplicationPrinter) .name serait mieux que "IAPplicationPritter".
Je voulais dire quelque chose de plus dans les lignes de typeof (iappplicationPritter) .isAssignABLeFrom (type) code>. Complètement sûr et sans cordes utilisées.
Si vous avez utilisé Si vous ne voulez pas faire cela, vous pouvez stocker des usines dans le dictionnaire. L'usine peut être un objet qui implémente une interface (quelque chose comme si vous voulez que vous souhaitiez Dictionnaire iappplicationPinterfactory code>) ou juste un délégué pouvant créer l'objet. Dans votre cas, ce serait Dictionnaire dictionnaire iapplicationprinter code>. Ce que vous pouviez faire est de créer votre propre dictionnaire, qui vérifie le type lors de l'addition. Cela ne fait pas de sécurité en sécurité de la compilation, mais cela le rend plus sûr de l'heure d'exécution. P>
Je le ferais légèrement différemment:
private Dictionary<String, Func<IApplicationPrinter>> _converters;
public void Initialise()
{
foreach (string ext in WordPrinter.PrintableExtensions)
{
_converters.Add(ext, () => new WordPrinter());
}
}
public IApplicationPrinter GetPrinterFor(String extension)
{
if (_converters.ContainsKey(extension)) //case sensitive!
{
return _converters[extension].Invoke();
}
throw new PrinterNotFoundException(extension);
}
Je cherchais cette solution! Merci Pondidum, pas besoin de plus besoin d'un énorme si () nouveau a (); sinon si () nouveau b (); sinon si () nouveau c (); sinon si () Nouveau ... code> dans mon code.
Vous devez d'abord modifier votre approche pour accéder au tableau d'extensions car vous ne pouvez pas accéder à votre propriété sans créer d'instance. J'utiliserais une personnalisation attribut à Dites à votre dictionnaire de type quelle extension chaque classe prend en charge. Cela ressemblera à ceci: à l'aide de l'attribut vous permet de restreindre le type. Il y a deux façons d'archiver cela. P> Vous pouvez désormais simplement vérifier si une classe particulière possède l'attribut
PrintÉextensions CODE> et accédez à une propriété qui récupère toutes les extensions ou appelez une méthode qui enregistre directement toutes les extensions. p> p>
Pourquoi ne veulez-vous pas stocker des instances dans le dictionnaire?