2009-01-18 5 views
10

J'ai une classe de type ISimpleCache<IBrokeredDataObject> que je veux ajouter un alias de type (alors un type) dans le fichier App.ConfigY compris une classe générique dans le fichier Unity App.Config

la ligne

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

est évidemment faux en raison de la <>, mais je ne suis pas convaincu de leur échapper;

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

est correct soit.

Je suis en train d'extraire mon code pour utiliser Unity, je suis donc trop loin d'une base de code compilable pour le tester rapidement, et j'espérais obtenir une confirmation ici.

Répondre

21

Découvrez this blog Le post:

Pour écrire un type générique, utilisez le `` `signe suivi par le nombre de types génériques que l'interface/classe reçoit.

Et un commentaire dans la même page dit:

Pour utiliser un type constant dans le générique, vous devez utiliser des parenthèses ([[ ]]).

Donc je suppose que votre fichier de configuration doit contenir quelque chose comme ceci:

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

Notez l'utilisation du caractère "accent grave" ou "backquote" (`` ), not the normal single quote ( « `).

+3

Il vaut la peine d'ajouter que cela doit être "NON" (différence subtile mais importante) – tjrobinson

+0

@tjrobinson Fait. Merci. –

1

Et ce type est fortement signé en tant que paramètre générique.

<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" /> 
2

Et voici comment vous utilisez un type qui reçoit deux types génériques:

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

Vous pouvez utiliser chaque type sur une autre ligne si vous le souhaitez, de sorte qu'il est plus facile à comprendre. Notez que la première parenthèse doit être juste après le type (FamilySection`2 ** [**].

13

Je voudrais plutôt commenter la réponse ci-dessus, mais mon score n'est pas assez élevé.

La syntaxe est documentée pour la méthode Type.GetType (chaîne) ici: http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx

Il y a un tas d'exemples, quelques-unes dont je collais ci-dessous.

Un type générique avec un argument de type

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

Un type générique avec deux arguments de type

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

Un type générique avec deux arguments de type assemblage qualifié

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

Un type générique assemblage qualifié avec un argument de type montage qualifié

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

Un type générique dont l'argument le type est un type générique avec deux arguments de type

Type.GetType("MyGenericType`1[AnotherGenericType`2[MyType,AnotherType]]") 
+0

Comment pouvez-vous mieux comprendre le type et la valeur d'assemblage? J'essaye de charger des choses vraiment simples comme un int ou Guid et de devenir vraiment frustré parce que Unity ne l'aime pas et les messages d'exception ne sont que légèrement utiles. Par exemple, cela ne fonctionne pas:

Questions connexes