Type.GetType (string) с использованием синтаксиса "Generic <T>"? - PullRequest
3 голосов
/ 24 мая 2009

Я создаю общий серверный элемент управления ASP.NET, у которого есть атрибут, используемый для указания имени типа. Я использую конструктор элементов управления, чтобы сгенерировать общую версию своего элемента управления, передав значение атрибута Type.GetType(string). Это прекрасно работает. Однако, если тип, который я хочу указать, является общим, я должен использовать синтаксис, подобный этому:

<gwb:GenericControl runat="server" 
    TypeName="System.Collections.Generic.List`1[System.String]" />

Я бы хотел набрать его так:

<gwb:GenericControl runat="server"
    TypeName="System.Collections.Generic.List<System.String>" />

Я знаю, что мог бы вручную разобрать значение для угловых скобок и преобразовать их в квадратные скобки и добавить соответствующий префикс backtick-numeric, но Мне было интересно, есть ли какой-либо встроенный способ сделать это преобразование ? Я предполагаю, что синтаксис Generic<T> специфичен для C # (или, по крайней мере, отличается от VB.NET), поэтому я предполагаю, что мне также придется анализировать любой другой специфичный для языка синтаксис.

Я заметил, что ASP.NET MVC делает это в атрибуте Inherits директивы Page, но я не уверен, как.

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
    Inherits="System.Web.Mvc.ViewPage<MyModel>" %>

Ответы [ 3 ]

5 голосов
/ 24 мая 2009

Нет, нет встроенного способа сделать это. Причина в том, что имена типов, такие как Generic<T>, действительно специфичны для C #. Они на самом деле записаны по-разному в метаданных.

Краткая версия - это имя типа, за которым следует `, а затем число, соответствующее количеству общих параметров. Например, Generic<T> будет записано как Generic`1, а Generic<T1,T2> будет записано как Generic`2. Массивы немного усложняют синтаксис, но это общее правило.

Когда вы используете Type.GetType, вы фактически делаете запрос MetaData вместо запроса C #. Таким образом, имя типа должно быть предоставлено так, как оно отображается в MetaData.

2 голосов
/ 24 мая 2009

Нет встроенного способа сделать это. Вы должны разобрать это. Это, вероятно, то, что внутренняя среда MVC делает.

1 голос
/ 24 мая 2009

Вы не сможете использовать этот конкретный синтаксис. Ваш фактический синтаксис должен быть следующим из-за природы xml:

<gwb:GenericControl runat="server"
    TypeName="System.Collections.Generic.List&lt;System.String>" />

Вы не можете использовать символ <в значении атрибута, если присутствует соответствующий ему>. Вы должны закодировать его с помощью & lt ;, что в первую очередь лишает смысла попытки заставить его работать таким образом.

Первая форма является стандартной формой IL (т. Е. Namespace.GenericClass`1 [[System.String]]) и должна быть несколько знакома любому искушенному пользователю языка .NET и распространена по всем направлениям, в то время как вторая является действительной для C #.

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