无法在第三方类上调用 ToArray()
本文关键字:调用 ToArray 第三方 | 更新日期: 2023-09-27 18:37:21
我打算在第三方类(Kentico)上使用一些LINQ,但似乎无法这样做,我也不知道为什么。我的代码本质上是:
using System;
using System.Collections.Generic;
using System.Linq;
// some additional namespaces
namespace test
{
public partial class ProductFilter : CMSAbstractBaseFilterControl
{
protected IEnumerable<String> GetCategories(String parentName)
{
CategoryInfo info = CategoryInfoProvider.GetCategoryInfo(parentName, CMSContext.CurrentSite.SiteName);
var children = CategoryInfoProvider.GetChildCategories(info.CategoryID, null, null, -1, null, CMSContext.CurrentSite.SiteID);
children.ToArray();
}
}
在这一点上,我收到错误
错误 5 'CMS。SettingsProvider.InfoDataSet' 不包含"ToArray"的定义,也没有扩展方法 "ToArray"接受类型的第一个参数 'CMS。SettingsProvider.InfoDataSet' 可以找到(您是否缺少使用指令或程序集 参考?
CategoryInfoProvider.GetChildCategories定义为:
public static InfoDataSet<CategoryInfo> GetChildCategories(int categoryId, string where, string orderBy, int topN, string columns, int siteId);
信息数据集定义为:
public class InfoDataSet<InfoType> : ObjectDataSet<BaseInfo>, IEnumerable<InfoType>, IInfoDataSet, IEnumerable where InfoType : CMS.SettingsProvider.BaseInfo, new()
{
public InfoDataSet();
public InfoDataSet(DataSet sourceData);
public InfoObjectCollection<InfoType> Items { get; protected set; }
protected InfoType Object { get; set; }
public InfoDataSet<InfoType> Clone();
public IEnumerator<InfoType> GetEnumerator();
public InfoType GetNewObject(DataRow dr);
protected override ObjectCollection<BaseInfo> NewCollection();
}
看起来接口已正确实现,我已经为 LINQ 提供了命名空间,我可以进行如下调用List<int> i; i.ToArray();
我缺少拼图的哪一部分?
尝试溜进给AsEnumerable()
的电话:
using System;
using System.Collections.Generic;
using System.Linq;
// some additional namespaces
namespace test
{
public partial class ProductFilter : CMSAbstractBaseFilterControl
{
protected IEnumerable<String> GetCategories(String parentName)
{
CategoryInfo info = CategoryInfoProvider.GetCategoryInfo(parentName, CMSContext.CurrentSite.SiteName);
var children = CategoryInfoProvider.GetChildCategories(info.CategoryID, null, null, -1, null, CMSContext.CurrentSite.SiteID);
children.AsEnumerable().ToArray();
}
}
}
问题似乎是编译器无法将children
解析为 IEnumerable,即使集合显式实现了接口也是如此。强制将集合视为 IEnumerable(AsEnumerable 这样做)应该允许正确解析 ToArray。