将命名空间传递给函数

我有一个函数,它接受一个word文档并以html格式保存。 我想使用相同的函数来处理任何文档类型。 由于Jon Skeet指出,我尝试使用generics(我假设不同的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 - ie Word is a namespace not a class private void convertDocToHtm2( 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( filename ); convertDocToHtm2( filename ); 

不,这是不可能的。 类型参数用于类型 ,而不是名称空间

特别是,编译器无法validation这种类型是否存在 – 例如,您可以调用ConvertDocToHtm2

使用C#4中的动态类型,您可以执行以下操作:

 private void ConvertDocToHtm2(string filename) where TApplication : new() { dynamic app = new TApplication(); dynamic doc = app.Documents.Open(filename, html: trueValue); // Other stuff here } 

然后:

 ConvertDocToHtm2(filename); 

(顺便说trueValue ,我已经猜到了trueValue的参数名称 – 你想validation它。)

一旦你拥有了这些对象dynamic可能非常适合这里(用于调用方法和访问属性等) – 但是,这适用于变量,而不适用于名称空间。

如果你真的需要命名空间(我不认为你这样做),你可以将它作为字符串传递并使用Activator.CreateInstance(namespace + ".Application")

然而,阅读它 – 似乎只需要应用程序 ; 也许:

 private void convertDocToHtm2( string filename ) where T : class, new(); { dynamic app = new T(); dynamic doc = app.Documents.Open(fileName); // etc } 

并调用convertDocToHtm2(filename)

这是不可能的,因为C#中的generics是编译时function,并且必须在编译时知道该类型。 这是不可能的,因为不同Office应用程序的API不共享公共基类。 在C ++中它可以工作,因为C ++模板被编译成在运行时评估的类。 但即便如此,它只适用于API的一小部分,因为它们一样!

如果您不想使用动态类型,并且只在每个命名空间中使用几个方法,并且这些方法具有相同的签名,则可以构造ConvertDocToHtml2以接受委托。 然后将Word / Excel下的方法作为那些委托传递。