C# для начинающих: куда делся мой метод IList.Where()?

У меня есть еще один простой (я думаю), который ставит меня в тупик. Я написал метод в одном из своих элементов управления, который получает последнюю версию файла в 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


person Iain Fraser    schedule 19.11.2009    source источник


Ответы (3)


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

person Joel Coehoorn    schedule 19.11.2009

Джоэл был первым, но подробнее об этом: Where() — это метод расширения< /а>. Методы расширения — это статические методы, которые действуют как настоящие методы и объявляются следующим образом:

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

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

"hello".AnExtensionMethod();

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

person Robert Fraser    schedule 19.11.2009
comment
Отличное объяснение, спасибо, Роберт :). Люблю это место, я не могу поверить, как много я взял от вас, ребята. Спасибо еще раз. - person Iain Fraser; 19.11.2009
comment
@Iain Открою вам секрет: когда я начал использовать SO около года назад, я ничего не знал ни о чем новом в .Net 3.5. Я использовал SO как способ помочь себе узнать о том, что нового в VS2008, и даже о некоторых хитростях для VS2005, и это было достаточно эффективно, чтобы быстро помочь мне быстро считаться здесь экспертом. - person Joel Coehoorn; 19.11.2009
comment
@ Роберт, вернись ;) @ Джоэл, спасибо за подсказку, приятель. Я определенно вижу, как вы можете очень быстро набрать скорость практически во всем, используя SO. Что меня поражает, так это то, насколько люди свободны и открыты со своими знаниями и насколько они терпимы к новичкам. SO, похоже, привлекает нужных людей, в отличие от многих других служб вопросов и ответов, знающих, но не претенциозных, и таких полных ответов. - person Iain Fraser; 19.11.2009

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

person Nate    schedule 19.11.2009