Что делает этот синтаксис C #? - PullRequest
1 голос
/ 28 июля 2011

Я читаю пост о разработке мобильных веб-приложений и ASP.NET MVC здесь: http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx.

В этой статье Скотт Хансельман проходит через процесс создания своего собственного механизма представления для отображения различных представлений на основезапрашивается ли сайт из мобильного веб-браузера или нет.

В своем классе MobileHelpers у него есть несколько методов с подписями, которые мне очень чужды.Вот пример:

        public static void AddMobile<T>(this ViewEngineCollection ves, Func<ControllerContext, bool> isTheRightDevice, string pathToSearch)        
        where T : IViewEngine, new()    
        {        
            ves.Add(new CustomMobileViewEngine(isTheRightDevice, pathToSearch, new T()));    
        }   

Я немного поработал с такими встроенными функциями (я думаю, так они называются), но эта логика ускользает от меня.Я также не понимаю цели линии where T : .......

Не могли бы вы, ребята, помочь мне понять, что здесь происходит?

Ответы [ 4 ]

7 голосов
/ 28 июля 2011

Было бы полезно, если бы вы могли определить, какие именно части сбивают вас с толку.Я выбрал два, я думаю, наиболее вероятных на основе вашего вопроса, и объяснил их.Если есть какой-либо другой синтаксис, который вас смущает, пожалуйста, отредактируйте ваш вопрос, чтобы объяснить, какой.

Пояснение к where T : IViewEngine, new()

C # позволяет вам наложить ограничения на общийпараметры типа.Вы можете прочитать больше об ограничениях здесь .

В вашем конкретном случае where T : IViewEngine означает, что любой тип T должен быть потомком типа IViewEngine.where T : new() - это специальный синтаксис, который указывает, что любой тип T должен иметь конструктор по умолчанию.

Пояснение к this ViewEngineCollection ves

Ключевое слово this означает, что метод AddMobileявляется методом расширения класса ViewEngineCollection.Это означает, что в дополнение к тому, что он называется AddMobile(someViewEngineCollection, ...), он может называться someViewEngineCollection.AddMobile(...).Вы можете прочитать больше о методах расширения здесь .

5 голосов
/ 28 июля 2011

Это называется методом расширения.Модификатор this первого параметра позволяет вызывать метод так, как если бы он был методом экземпляра типа `ViewEngineCollection.Например,

ViewEngineCollection col = ...;
col.AddMobile<SomeType>(() => true, "thepath");

Второй упомянутый вами элемент, where, называется общим ограничением.Он ограничивает набор типов, которые могут использоваться для T, теми типами, которые имеют открытый конструктор без параметров и являются производными от IViewEngine

1 голос
/ 28 июля 2011

this для метода расширения. Поэтому любая ссылка на ViewEngineCollection имеет метод расширения, называемый AddMobile. where T : IViewEngine, new() называется общим ограничением.

0 голосов
/ 28 июля 2011

Если вызывающее устройство содержит идентификационную информацию в деталях своего пользовательского агента (обычно это имя браузера или что-то в веб-приложении, метод нацелен на сопоставление механизма пользовательского просмотра с таблицей маршрутов для этого устройства.

Это немного универсально и без контекста может быть довольно запутанным, но каждое устройство идентифицирует себя уникальным способом (по крайней мере, уникальным по имени устройства).

по сути, этот метод идентифицирует правильный механизм просмотра, который будет использоваться для обработкипредоставленная информация об устройстве.

Поскольку все остальные пытаются объяснить ограничения и общие понятия, я подумал, что оставлю это профессионалам ...

http://msdn.microsoft.com/en-us/library/bb384067.aspx

..лучший способ действительно ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...