2009-11-19 5 views
3

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

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

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 всегда будет предоставлять доступ к тем же методам из того места, где вы его используете.

Я опять не, ха-ха :)


Edit: Filemanager.GetGroupAll() возвращает CMSList, который проходит IList

ответ

12

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

+0

Вы, сэр, являются абсолютной легендой bl ** dy! Отлично сработано! :) –

0

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

3

Joel был первым, но для этого можно развернуть: Where() is extension method. Методы расширения статические методы, которые действуют как реальные методы, и объявляются так:

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

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

"hello".AnExtensionMethod(); 

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

+1

Отличное объяснение, спасибо Роберт :). Любите это место, я не могу поверить, насколько я собрал вас от вас, ребята. Еще раз спасибо. –

+0

Ницца Фамилия :-) –

+0

@Iain Я расскажу вам «секрет»: когда я начал использовать SO около года назад, я знал, что ничего нового в .NET 3.5. Я использовал SO как способ помочь себе узнать, что нового в VS2008 и даже несколько трюков для VS2005, и это было достаточно эффективно, чтобы быстро помочь мне скоро стать экспертом здесь. –