将 .net 4.0 语法 OfType 转换为 .net 3.5

Posted

技术标签:

【中文标题】将 .net 4.0 语法 OfType 转换为 .net 3.5【英文标题】:convert .net 4.0 syntax OfType to .net 3.5 【发布时间】:2012-10-08 03:05:43 【问题描述】:

我有这个 .NET 4.0 代码:

var myTable = tables[1];
myTable = tables.Item["Table1"];
myTable = tables.OfType<Excel.ListObject>().FirstOrDefault(t => t.Name == "Table1");

我正在尝试使用 .NET 3.5 进行编译并遇到一堆错误:

错误 23 属性、索引器或事件“项目”不受 语言;尝试直接调用访问器方法 'Microsoft.Office.Interop.Excel.ListObjects.get_Item(object)'

错误 24 'Microsoft.Office.Interop.Excel.ListObjects' 不包含 'OfType' 的定义和最佳扩展方法重载 'System.Linq.Queryable.OfType(System.Linq.IQueryable)' 有 一些无效的参数

错误 25 实例参数:无法从 'Microsoft.Office.Interop.Excel.ListObjects' 到 'System.Linq.IQueryable'

您能否指导我了解这些错误的确切含义,以便我可以尝试将其转换为 .NET 3.5?

非常感谢您的建议。

【问题讨论】:

没有简单的解决方法。 ListObjects 接口有点笨拙,它有一个 Item 属性,它不是接口的默认属性。在 MSDN 文章中,默认名称为 _Default。 C# 版本 3 及更早版本仅支持一个索引器。 ListObjects 的错误。正如错误消息所述,您必须明确使用 get_Item()。这打破了 Linq。 【参考方案1】:

这个问题是指给This command requires at least two rows of source data的答案;该代码显示了在代码中访问表/列表对象的 3 种不同方式。

这是我发布的代码:

    var myTable = tables[1];
    var myTable = tables.Item["Table1"];
    var myTable = tables.OfType<Excel.ListObject>().FirstOrDefault(t => t.Name == "Table1");

我的意思是说明在代码中访问表有不同的方式。

为了把它放在上下文中,我创建了一个带有一个名为“TestButton”的按钮的功能区。这是完整的代码,应该适用于 3.5:

using Excel = Microsoft.Office.Interop.Excel;


    private void TestButton_Click(object sender, RibbonControlEventArgs e)
    
        var worksheet = (Excel.Worksheet) Globals.ThisAddIn.Application.ActiveSheet;
        var tables = worksheet.ListObjects;
        var table = tables.Item["Table1"]; // this is the line you are referring to

        //do something with table
    

【讨论】:

以上是关于将 .net 4.0 语法 OfType 转换为 .net 3.5的主要内容,如果未能解决你的问题,请参考以下文章

出现错误.. 从 .net 4.0 转换为 .net 3.5 时出现错误。

将连接字符串从 Microsoft.Jet.OLEDB.4.0 转换为 Microsoft.ACE.OLEDB.12.0 提供程序

转换为 Visual Studio 2010 / .Net 4.0 后 app.config “找不到架构信息”

将 c++ CString.Format 语法转换为 .NET 字符串语法(可变前导宽度和小数位)

从 .net 2.0 转换到 4.0 后对性能问题进行故障排除

将代码从 .net 4.0 回滚到 .net 3.5,现在动态不起作用