C # Начинающий: Куда делся мой метод IList.Where ()? - PullRequest
3 голосов
/ 19 ноября 2009

У меня есть еще один простой (я думаю), который ставит меня в тупик. Я написал метод в одном из своих элементов управления, который получает последнюю версию файла в CMS, учитывая его имя файла (т.е. независимо от того, в какой папке находится файл). Мне это показалось достаточно полезным, и я подумал, что я могу изменить его в своем классе CMSToolbox, но когда я это делаю, я больше не могу использовать метод Where() класса FileManager, предоставляемый CMS (который возвращает список). *

Вот упрощенный пример моего класса:

using System;
using System.Collections.Generic;
using CMS.CMS;
using CMS.Core;
using CMS.Web;

namespace CoA.CMS {
    public class ToolBox
    {
        public CMS.CMS.File getLatestFileVersionByFilename(string filename, int GroupID)
        {
            IList<CMS.CMS.File> fileWithName = FileManager.GetGroupAll(false, GroupID).Where(file => currentFileVersionIsNamed(file, filename)).ToList<CMS.CMS.File>();
            return getLatestFileFromListOfFiles(fileWithName);

        }
        protected bool currentFileVersionIsNamed(CMS.CMS.File file, string name)
        {
        }
        protected CMS.CMS.File  getLatestFileFromListOfFiles(CMS.CMS.File file)
        {
        }
    }
}

Когда я делаю то же самое в контексте элемента управления (на самом деле это класс, предоставляемый CMS, который расширяет Control), я имею доступ к методу Where(), но в моем классе ToolBox я этого не делаю. Что дает? Я полагал, что IList всегда будет разрешать доступ к одним и тем же методам, где бы вы их не использовали.

Я снова ошибаюсь, ха-ха:)


Редактировать: Filemanager.GetGroupAll() возвращает CMSList, который расширяет IList

Ответы [ 3 ]

12 голосов
/ 19 ноября 2009

Вам нужна директива using для System.Linq. .Where() - это метод расширения для IEnumerable<T> (который реализует IList<T>), определенный в пространстве имен System.Linq.

3 голосов
/ 19 ноября 2009

Джоэл был первым, но остановимся на этом: Где () - это метод расширения . Методы расширения - это статические методы, которые действуют как реальные методы и объявляются так:

static class NameNeverUsed
{
    public static void AnExtensionMethod(this string x)
    {
    }
}

И называется как:

"hello".AnExtensionMethod();

Их нужно импортировать, используя операторы, как и все остальное. Поэтому, в отличие от Java / C ++, класс может иметь методы, объявленные вне его.

0 голосов
/ 19 ноября 2009

IIRC, этот метод .Where является частью LINQ, и вам нужно добавить те, которые используют операторы в вашем классе, чтобы получить методы расширения для интерфейса IEumerable.

...