Tengo un conjunto de clases, cada una de las cuales puede abrir diferentes tipos de archivos usando una aplicación externa y decirle a esa aplicación que imprima el archivo en una impresora en particular. Todas las clases heredan una clase abstracta común y una interfaz.Diccionario de tipos de clase
internal interface IApplicationPrinter : IDisposable
{
string ApplicationExe { get; }
string ApplicationName { get; }
string[] PrintableExtensions { get; }
IApplicationPrinter CreateInstance(string Filename, string Printer);
void Print();
bool ExitApplicationAfterPrint { get; set; }
bool WaitApplicationExitOnPrint { get; set; }
System.IO.FileInfo PdfFile { get; protected set; }
}
internal abstract class ApplicationPrinter : IApplicationPrinter
{
...
}
internal class WordPrinter : ApplicationPrinter
{
internal static string[] PrintableExtensions { get { return new string[]{".doc", ".docx" }; } }
...
}
internal class ExcelPrinter : ApplicationPrinter
{
internal static string[] PrintableExtensions { get { return new string[]{".xls", ".xlsx" }; } }
...
}
estoy tratando de crear un Dictionary
de extensiones de archivo para imprimir y que corresponde Type
s de clases que pueden imprimir dichos archivos. Hago no quiero crear una instancia de las clases en el diccionario.
private static Dictionary<string, Type> FileConverters;
static Printer()
{
FileConverters = new Dictionary<string, Type>();
foreach (string ext in WordPrinter.PrintableExtensions)
{
FileConverters.Add(ext, typeof(WordPrinter));
}
string filename = "textfile.txt";
string extension = filename.Substring(filename.LastIndexOf("."));
if (FileConverters.ContainsKey(extension))
{
IApplicationPrinter printer = ((IApplicationPrinter)FileConverters[extension]).CreateInstance(filename, "Printer");
printer.Print();
}
}
¿Hay alguna manera de hacer Dictionary<string, Type> FileConverters
con seguridad de tipos más, restringiendo a los valores que implementan IApplicationPrinter? En otras palabras, es algo como esto sea posible:
private static Dictionary<string, T> FileConverters where T: IApplicationPrinter;
Actualización: no quiero para almacenar instancias por las siguientes dos razones:
- Cada clase puede manejar varios tipos de archivos diferentes (ver
string[] PrintableExtensions
) El diccionario almacena extensiones como claves. No hay utilidad en crear y almacenar múltiples separa la instancia de la misma clase. - Cada clase de impresora utiliza COM API y Office Interop para crear instancias de aplicaciones de terceros. Es mejor que se cree una nueva instancia de cada clase para un trabajo de impresión cuando sea necesario y que el recolector de basura pueda realizar una limpieza posterior.
¿Por qué no quiere almacenar instancias en el diccionario? – svick