【发布时间】:2015-08-28 16:00:51
【问题描述】:
[背景:] 为了使针对 Excel 的互操作 API 的编程更容易,我为常见任务创建了许多扩展方法。其中许多是 Excel 集合对象(如 Workbooks、Sheets 等)的 LINQ 样式方法。所有扩展方法都在一个程序集中,我在任何需要这些方法的应用程序或加载项中引用该程序集。扩展方法程序集和目标应用程序都嵌入了来自同一主互操作程序集的互操作类型。一切都是在 .NET 4.0 上用 C# 编写并引用 PIA 版本 15。
我刚刚为 ListObjects 接口创建了一些扩展方法,它们给了我编译器错误,“来自程序集 Y.dll 的成员 X 不能跨程序集边界使用,因为它包含一个具有泛型类型参数的类型,它是嵌入式互操作类型。”
这是导致错误的方法:
public static IEnumerable<ListObject> Where(this ListObjects me,Func<ListObject, Boolean> condition) {
var list = new List<ListObject>();
foreach (ListObject x in me)
if (condition(x)) list.Add(x);
return list;
}
这是一个类似的方法:
public static IEnumerable<Workbook> Where(this Workbooks me, Func<Workbook, Boolean> condition) {
var list = new List<Workbook>();
foreach (Workbook x in me)
if (condition(x)) list.Add(x);
return list;
}
为什么一个可以跨程序集边界工作而另一个不能?
更正,这两种方法都不适用于该特定应用程序。但是,通过为 ListObjects 创建一个 ToArray() 扩展方法,然后在我的应用程序中调用它并在数组上调用 LINQ 方法,我能够获得所需的结果。
为什么强类型列表不被算作泛型类型?
ListObject[] 如何不仅仅是 Array{ListObject} 的语法糖?
【问题讨论】:
标签: c# excel extension-methods com-interop excel-interop