【发布时间】:2023-04-06 00:03:01
【问题描述】:
我有一组类,每个类都可以使用外部应用程序打开不同类型的文件,并告诉该应用程序将文件打印到特定的打印机。这些类都继承了一个公共抽象类和一个接口。
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 和可以打印此类文件的相应类Types。我确实不想实例化字典中的类。
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 的值来使Dictionary<string, Type> FileConverters 更加类型安全?换句话说,这样的事情是否可能:
private static Dictionary<string, T> FileConverters where T: IApplicationPrinter;
更新: 我不想存储实例有以下两个原因:
- 每个类可以处理几种不同的文件类型(参见
string[] PrintableExtensions)。字典将扩展存储为键。创建和存储同一类的多个单独实例没有任何实用程序。 - 每个打印机类都使用 COM API 和 Office 互操作来创建第三方应用程序的实例。最好在需要时为打印作业创建每个类的新实例,然后垃圾收集器可以随后进行清理。
【问题讨论】:
-
为什么不想在字典中存储实例?