0

サードパーティのクラス (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」の定義が含まれておらず、タイプ「CMS.SettingsProvider.InfoDataSet」の最初の引数を受け入れる拡張メソッド「ToArray」が見つかりませんでした (using ディレクティブまたはアセンブリ参照?)

CategoryInfoProvider.GetChildCategories は次のように定義されています。

public static InfoDataSet<CategoryInfo> GetChildCategories(int categoryId, string where, string orderBy, int topN, string columns, int siteId);

InfoDataSet は次のように定義されます。

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();ます。

4

1 に答える 1

1

への呼び出しを挿入してみてください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 を適切に解決できるようになります。

于 2013-10-28T16:59:03.330 に答える