Включение универсального класса в файл Unity App.Config

У меня есть класс типа ISimpleCache<IBrokeredDataObject>, который я хочу добавить в качестве псевдонима типа (затем типа) в файле App.Config.

линия

<typeAlias alias="ISimpleCacheOfIBrokeredDataObject" type="MyApplication.ISimpleCache<IBrokeredDataObject>, MyApplication" />

очевидно неправильно из-за ‹>, однако я не уверен, что их можно избежать;

<typeAlias alias="ISimpleCacheOfIBrokeredDataObject" type="MyApplication.ISimpleCache&lt;IBrokeredDataObject&gt;, MyApplication" />

тоже правильно.

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


person johnc    schedule 18.01.2009    source источник


Ответы (4)


Ознакомьтесь с эта запись в блоге:

Чтобы написать универсальный тип, используйте знак `, за которым следует количество общих типов, которые получает интерфейс/класс.

И комментарий на той же странице сказал:

Чтобы использовать константный тип в дженерике, вам нужно использовать скобки ([[ ]]).

Итак, я думаю, ваш файл конфигурации должен содержать что-то вроде этого:

<typeAlias alias="ISimpleCacheOfIBrokeredDataObject"
   type="MyApplication.ISimpleCache`1[[MyApplication.IBrokeredDataObject, MyApplication]], MyApplication" />

Обратите внимание на использование символа «серьезный ударение» или «обратная кавычка» (`), а не обычной одинарной кавычки (').

person Hosam Aly    schedule 18.01.2009
comment
Стоит добавить, что это должно быть `НЕ' (тонкое, но важное отличие). - person Tom Robinson; 09.02.2012

Я бы предпочел прокомментировать ответ выше, но моя оценка недостаточно высока.

Синтаксис метода Type.GetType (строка) задокументирован здесь: http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx

Есть куча примеров, некоторые из которых я вставил ниже.

Универсальный тип с одним аргументом типа

Type.GetType("MyGenericType`1[MyType]")

Универсальный тип с двумя аргументами типа

Type.GetType("MyGenericType`2[MyType,AnotherType]")

Общий тип с двумя аргументами типа с указанием сборки

Type.GetType("MyGenericType`2[[MyType,MyAssembly],[AnotherType,AnotherAssembly]]")

Универсальный тип с указанием сборки с аргументом типа с указанием сборки

Type.GetType("MyGenericType`1[[MyType,MyAssembly]],MyGenericTypeAssembly")

Универсальный тип, аргумент типа которого является универсальным типом с двумя аргументами типа

Type.GetType("MyGenericType`1[AnotherGenericType`2[MyType,AnotherType]]")
person ken    schedule 22.09.2011
comment
Как лучше всего определить тип и значение сборки? Я пытаюсь загрузить некоторые действительно простые вещи, такие как int или Guid, и очень расстраиваюсь, потому что Unity не нравится ничего из этого, а сообщения об исключениях лишь немного полезны. Например, это не работает: ‹alias alias=IRepoGeneric type=ConfigFile4MultipleTemplateTypes.IRepoGeneric`2[[ConfigFile4MultipleTemplateTypes.Foo,ConfigFile4MultipleTemplateTypes],[System.Guid,mscorib.System]], ConfigFile4MultipleTemplateTypes /› - person Dan Csharpster; 21.09.2015

И вот как вы используете тип, который получает два универсальных типа:

<section name="doubleFamilyConfig"
         type="ConfigTest.Configuration.FamilySection`2[
               [ConfigTest.Types.Child, ConfigTest],
               [ConfigTest.Types.Parent, ConfigTest]
               ],
               ConfigTest" />

При желании вы можете использовать каждый тип в отдельной строке, чтобы его было легче понять. Обратите внимание, что первая скобка должна быть сразу после типа ( FamilySection`2**[** ).

person Alex Vilela    schedule 05.10.2009

И это строго подписанный тип в качестве универсального параметра.

<typeAlias alias="IPublisherOfXElement" type="MyLib.IX.IPublisher`1[[System.Xml.Linq.XElement, System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], MyLib.IX" />
person Pavel Savara    schedule 29.06.2009