Word Interop 代码中的歧义性

9
我最近在这里发布了一个关于读取Word文件的问题:这里
应用程序运行正常,但是我收到了以下警告消息:
警告:方法'Microsoft.Office.Interop.Word._Document.Close(ref object, ref object, ref object)'和非方法'Microsoft.Office.Interop.Word.DocumentEvents2_Event.Close'之间存在歧义。使用方法组。
由于某些命名空间的模糊性,我想知道如何解决此问题。虽然应用程序可以运行,但我想尽量减少警告/错误。
下面是该类的代码;它所涉及的行是以下两行:
docs.Close(ref nullobject, ref nullobject, ref nullobject);
wordObject.Quit(ref nullobject, ref nullobject, ref nullobject);

整段代码:
namespace Wizard.Classes
{
    class MSWordReader
    {
        public void read(String filename)
        {
            String buffer = "";
            try
            {
                Microsoft.Office.Interop.Word.Application wordObject = new   
                Microsoft.Office.Interop.Word.Application();
                object file = filename; //this is the path
                object nullobject = Type.Missing;
                object visible = false;
                object readonlyp = true;
                object addtorecent = false; //add to words recent filelist

                Microsoft.Office.Interop.Word.Document docs = wordObject.Documents.Open
                    (ref file,ref nullobject, ref readonlyp, ref addtorecent,
                    ref nullobject, ref nullobject, ref nullobject, ref nullobject,
                    ref nullobject, ref nullobject, ref nullobject, ref visible,
                    ref nullobject, ref nullobject, ref nullobject, ref nullobject
                                    );
                docs.ActiveWindow.Selection.WholeStory();
                docs.ActiveWindow.Selection.Copy();
                IDataObject data = Clipboard.GetDataObject();
                buffer = data.GetData(DataFormats.Text).ToString();

                docs.Close(ref nullobject, ref nullobject, ref nullobject);

                wordObject.Quit(ref nullobject, ref nullobject, ref nullobject);
                MessageBox.Show(buffer);

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}
3个回答

21
为消除歧义,请使用:
((Microsoft.Office.Interop.Word._Document)docs).Close(ref nullobject, ref nullobject, ref nullobject);    
((Microsoft.Office.Interop.Word._Application)wordObject).Quit(ref nullobject, ref nullobject, ref nullobject);

6

尝试首先转换您的文档

((_Document)docs).Close(ref nullobject, ref nullobject, ref nullobject);

Microsoft.Office.Interop.Word.Document接口实现了DocumentEvents2_Event_Document接口。每个接口都有一个close方法,编译器无法确定你指的是哪一个。

或者,你可以在一开始将docs变量声明为_Document

Microsoft.Office.Interop.Word._Document docs = wordObject.Documents.Open ...

相同的解决方案可以用于您的wordObject上的歧义,将其转换为_Application

1
提议的解决方案运行良好,但会导致ReSharper出现“模棱两可的调用”错误,除了在R#错误对话框中使用旧的“忽略错误”技巧外,无法摆脱该错误,尽管编译器已经足够满意。我无法从R#中得到一个好的解决方案,而且只有在少数地方才会出现这种情况,所以我找到的最佳答案是将其转换为动态类型,这样既可以正常工作,又不会产生Visual Studio或R#错误。
((dynamic) Doc).Close();

虽然不是很理想,但我只能咬紧牙关使用它。如果您要多次使用它,您可以将其保存到动态变量中。您理论上可以在所有内容中使用动态变量(它只是后期绑定的COM),但这样会失去所有智能提示,所以我只在少数需要使用它的方法和事件中使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接