У меня есть набор классов, каждый из которых может открывать файлы разных типов с помощью внешнего приложения и сообщать этому приложению о печати файла на конкретный принтер. Все классы наследуют общий абстрактный класс и интерфейс.Словарь классов классов
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" }; } }
...
}
Я пытаюсь создать Dictionary
печатаемых расширения файлов и соответствующий 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<string, Type> FileConverters
, ограничивая его до значений, которые реализуют IApplicationPrinter? Другими словами, это что-то вроде этого можно:
private static Dictionary<string, T> FileConverters where T: IApplicationPrinter;
Update: Я не хочу, чтобы хранить экземпляры для следующих двух причин:
- Каждый класс может обрабатывать несколько файлов различных типов (см
string[] PrintableExtensions
). Словарь хранит расширения как ключи. В создании и хранении нескольких экземпляров разделов одного и того же класса нет никакой полезности. - Каждый класс принтера использует COM API и Office Interop для создания экземпляров сторонних приложений. Лучше, чтобы новый экземпляр каждого класса был создан для задания печати, когда это требуется, и что сборщик мусора может впоследствии очистить.
Почему вы не хотите хранить экземпляры в словаре? – svick