Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将命名空间传递给函数_C#_.net_Ms Office_Office Interop - Fatal编程技术网

C# 将命名空间传递给函数

C# 将命名空间传递给函数,c#,.net,ms-office,office-interop,C#,.net,Ms Office,Office Interop,我有一个函数,它接受word文档并将其保存为html格式。我希望使用相同的函数处理任何文档类型。我尝试过使用泛型(我假设不同的docapi是相同的),但由于jonskeet指出的原因,它失败了。还有别的办法吗 using Word = Microsoft.Office.Interop.Word; using Excel = Microsoft.Office.Interop.Excel; //Works ok private void convertDocToHtm( string filena

我有一个函数,它接受word文档并将其保存为html格式。我希望使用相同的函数处理任何文档类型。我尝试过使用泛型(我假设不同的docapi是相同的),但由于jonskeet指出的原因,它失败了。还有别的办法吗

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 );
使用Word=Microsoft.Office.Interop.Word;
使用Excel=Microsoft.Office.Interop.Excel;
//行吗
私有void convertDocToHtm(字符串文件名)
{
剪
var app=新单词.Application();
var doc=新单词.Document();
doc=应用文件。打开(参考文件名、参考缺失、参考真实值、参考缺失、参考缺失、参考缺失、参考缺失、参考缺失、参考缺失、参考缺失、参考缺失、参考缺失、参考缺失、参考缺失、参考缺失、参考缺失);
剪
}
//失败(编译),因为“T”是“类型参数”,在给定上下文中无效-即Word是命名空间而不是类
私有void convertDocToHtm2(字符串文件名)
{
剪
var app=新的T.应用程序();
var doc=新的T.文档();
doc=应用文件。打开(参考文件名、参考缺失、参考真实值、参考缺失、参考缺失、参考缺失、参考缺失、参考缺失、参考缺失、参考缺失、参考缺失、参考缺失、参考缺失、参考缺失、参考缺失、参考缺失);
剪
}
//举例
convertDocToHtm(文件名);
convertDocToHtm2(文件名);
convertDocToHtm2(文件名);

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

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

使用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
}
private void ConvertDocToHtm2(字符串文件名)
其中:new()
{
动态应用程序=新的应用程序();
动态文档=app.Documents.Open(文件名,html:trueValue);
//这里还有其他东西
}
然后:

ConvertDocToHtm2(文件名);
(顺便说一句,我猜到了
trueValue
的参数名,您需要验证一下。)

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

如果您真的需要名称空间(我认为您不需要),可以将其作为字符串传入,并使用
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
}
private void convertDocToHtm2(字符串文件名),其中T:class,new();
{
动态app=newt();
动态文档=app.Documents.Open(文件名);
//等
}

并调用为
convertDocToHtm2(filename)

,这是不可能的,因为C#中的泛型是编译时特性,并且类型必须在编译时已知。这是不可能的,因为不同Office应用程序的API不共享公共基类。在C++中,它可以工作,因为C++模板被编译成在运行时进行评估的类。但即使这样,它也只适用于API的一小部分,因为它们不一样

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

@Patrick:如果是这样的话,我想你会陷入手动反射,或者为每个应用程序使用单独的方法。无论如何,它没有用处,因为
Excel。应用程序
不包含名为
Documents
的属性,所以此方法只能用于Word文档。@AS-CII:很公平。我假设OP已经确保了相关成员可以在不同的应用程序类上使用:)谢谢ascii,我希望MS能够使基本的打开和保存功能保持不变,但不指望它
private void convertDocToHtm2<T>( string filename ) where T : class, new();
{
     dynamic app = new T();
     dynamic doc = app.Documents.Open(fileName);

     // etc
}