1

Comment passer un type inconnu qui sera défini dans une autre classe en tant que paramètre dans une telle expression. Je ne sais pas comment appeler l'expression. et je ne sais pas pourquoi il ne peut pas se souvenir du type entre les crochets et quelle est la solution.Passage d'un type inconnu entre parenthèses

.AddCallHandler<asp.CallHandlerType> 

Le code:

foreach (IAspect asp in Policy.Aspects) 
{ 
    //Type callHandlerType = asp.CallHandlerType; 
    policy.AddMatchingRule(ruleLog) 
    .AddCallHandler<asp.CallHandlerType>(new 
     ContainerControlledLifetimeManager()); 
} 

On dit le type ou espace de noms pour "asp" n'existe pas. J'ai aussi essayé de le définir plus tôt et de le passer "callHandlerType", encore un problème similaire.

foreach asp le type CallHandler serait différent, dans un il serait RestaurantCallHandler, dans l'autre il pourrait être MagicCallHandler. Celles-ci ont été définies dans les aspects.

définition de méthode de l'interface:

public interface IAspect 
{ 
    Type CallHandlerType { get; set; } 
    // e.g it can be "MagicCallHandler : ICallHandler 
} 
+0

bien où appelez cette méthode vous? Pourriez-vous en faire une méthode générique? –

+0

@Jon Skeet Salut Jon, oui je peux. C'est un framework AOP que j'écris pour Unity. Je poste la définition de la méthode d'interface. pas professionnel sur les génériques mais toujours en les utilisant. Si vous l'avez modifié en un formulaire générique, veuillez publier un exemple d'utilisation de ligne après l'appel. merci – LastBye

+0

Ah, après avoir relu la question, je pense que je vois le problème. D'accord ... cela peut être fait avec la réflexion. –

Répondre

2

En général, si vous ne connaissez pas le type à la compilation, vous pouvez utiliser la réflexion pour créer un type générique lors de l'exécution.

Toutefois, dans ce cas, Unity fournit des surcharges de méthode non génériques (pour la plupart des fonctionnalités) qui acceptent des arguments de type System.Type au lieu d'arguments de type générique. Cela vous permet de spécifier des types lors de l'exécution ou d'utiliser des types génériques non liés.

Dans votre cas, vous pouvez utiliser ce code pour enregistrer vos gestionnaires d'appels sans réflexion nécessaire:

foreach (IAspect asp in Policy.Aspects) 
{ 
    policy.AddMatchingRule(ruleLog) 
     .AddCallHandler(asp.CallHandlerType, 
     new ContainerControlledLifetimeManager()); 
} 
+0

Je jouais avec les surcharges, il me semble que j'ai raté ça ou intellisense car je me souviens qu'il ne m'a pas montré de surcharges différentes. Il semble que cela devrait simplement fonctionner. Merci. – LastBye

Questions connexes