Словарь типов классов

У меня есть набор классов, каждый из которых может открывать разные типы файлов с помощью внешнего приложения и указывать этому приложению, что нужно распечатать файл на определенном принтере. Все классы наследуют общий абстрактный класс и интерфейс.

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" }; } }
    ...
}

Я пытаюсь создать Словарь расширений печатаемых файлов и соответствующих классов Type , которые могут печатать такие файлы. Я не хочу создавать экземпляры классов в словаре.

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();
    }
}

Есть ли способ сделать Dictionary FileConverters более типобезопасным, ограничив его значениями, реализующими IApplicationPrinter? Другими словами, возможно что-то вроде этого:

private static Dictionary<string, T> FileConverters where T: IApplicationPrinter;

Обновление: Я не хочу хранить экземпляры по следующим двум причинам:

  1. Каждый класс может обрабатывать несколько разных типов файлов (см. string [] PrintableExtensions ). Словарь хранит расширения как ключи. Нет никакой полезности в создании и хранении нескольких отдельных экземпляров одного и того же класса.
  2. Каждый класс принтера использует COM API и Office Interop для создания экземпляров сторонних приложений. Лучше, чтобы новый экземпляр каждого класса создавался для задания печати, когда это необходимо, и чтобы сборщик мусора мог очистить его после этого.
6
задан Serge 28 January 2012 в 11:18
поделиться