我有一个函数,它接受一个word文档并以html格式保存。我想使用相同的函数来处理任何文档类型。由于Jon Skeet指出,我尝试使用泛型(我假设不同的doc API是相同的)失败了。还有另一种方式吗?
using Word = Microsoft.Office.Interop.Word;
using Excel = Microsoft.Office.Interop.Excel;
//Works ok
private void convertDocToHtm( string filename )
{
... snip
var app = new Word.Application();
var doc = new Word.Document();
doc = app.Documents.Open(ref fileName, ref missing, ref trueValue, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
... snip
}
//fails dismally (to compile) because 'T' is a 'type parameter', which is not valid in the given context - i.e Word is a namespace not a class
private void convertDocToHtm2<T>( string filename )
{
... snip
var app = new T.Application();
var doc = new T.Document();
doc = app.Documents.Open(ref fileName, ref missing, ref trueValue, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
... snip
}
//calling examples
convertDocToHtm( filename );
convertDocToHtm2<Word>( filename );
convertDocToHtm2<Excel>( filename );
答案 0 :(得分:5)
不,这是不可能的。类型参数适用于类型,而不是名称空间。
特别是,编译器无法验证这种类型是否存在 - 例如,您可以调用ConvertDocToHtm2<System>
。
使用C#4中的动态类型,可以执行以下操作:
private void ConvertDocToHtm2<TApplication>(string filename)
where TApplication : new()
{
dynamic app = new TApplication();
dynamic doc = app.Documents.Open(filename, html: trueValue);
// Other stuff here
}
然后:
ConvertDocToHtm2<Word.Application>(filename);
(顺便说一下,我已经猜到了trueValue
的参数名称 - 你想要验证它。)
答案 1 :(得分:1)
一旦你拥有了对象,dynamic
可能非常适合这里(用于调用方法和访问属性等) - 但是,只有 > 适用于变量,而不适用于名称空间。
如果你真的需要名称空间(我认为你不这样做),你可以把它作为字符串传递并使用Activator.CreateInstance(namespace + ".Application")
。
然而,阅读它 - 似乎只需要应用程序;也许:
private void convertDocToHtm2<T>( string filename ) where T : class, new();
{
dynamic app = new T();
dynamic doc = app.Documents.Open(fileName);
// etc
}
并拨打convertDocToHtm2<Word.Application>(filename)
答案 2 :(得分:1)
这是不可能的,因为C#中的泛型是编译时功能,并且必须在编译时知道该类型。这是不可能的,因为不同Office应用程序的API不共享公共基类。在C ++中它可以工作,因为C ++模板被编译成在运行时评估的类。但即便如此,它只适用于API的一小部分,因为它们不相同!
答案 3 :(得分:1)
如果您不想使用动态类型,并且只在每个命名空间中使用几个方法,并且这些方法具有相同的签名,则可以构造ConvertDocToHtml2以接受委托。然后将Word / Excel下的方法作为那些代理传递。