У меня есть набор классов, каждый из которых может открывать разные типы файлов с помощью внешнего приложения и указывать этому приложению, что нужно распечатать файл на определенном принтере. Все классы наследуют общий абстрактный класс и интерфейс.
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
более типобезопасным, ограничив его значениями, реализующими IApplicationPrinter? Другими словами, возможно что-то вроде этого:
private static Dictionary<string, T> FileConverters where T: IApplicationPrinter;
Обновление: Я не хочу хранить экземпляры по следующим двум причинам:
string [] PrintableExtensions
). Словарь хранит расширения как ключи. Нет никакой полезности в создании и хранении нескольких отдельных экземпляров одного и того же класса.