2010-01-13 5 views
6

J'ai une application Silverlight qui a deux XAP différents - un InitialXAP qui est chargé statiquement par la page HTML et un DynamicXAP qui est chargé à partir du code dans le XAP initial. Le DynamicXAP est chargé avec un code similaire à ceci:Silverlight: Vous ne pouvez pas utiliser la réflexion à GetValue d'un champ à travers les XAP?

var asm = LoadAssemblyFromXap(stream, "DLLName"); 
// LoadAssemblyFromXAP will load the DynamicXAP as a file stream, 
// unpack it and load DLLName as a dll. 
var controllerType = asm.GetType("ClassNameToInstantiate_InsideAsm"); 
var constructor = controllerType.GetConstructor(Type.EmptyTypes); 
return constructor.Invoke(null); 

J'ai une classe qui utilise la réflexion (en particulier FieldInfo.GetValue) pour effectuer la liaison de données. Cette classe est définie dans InitialXAP. Si je tente d'utiliser cette classe dans le DynamicXAP, je reçois une erreur:

Message: Unhandled Error in Silverlight Application System.FieldAccessException: Class.In.DynamicXAP.Which.Uses.The.Reflection.Class.In.InitialXAP 
    at System.Reflection.RtFieldInfo.PerformVisibilityCheckOnField(IntPtr field, Object target, IntPtr declaringType, FieldAttributes attr, UInt32 invocationFlags) 
    at System.Reflection.RtFieldInfo.InternalGetValue(Object obj, Boolean doVisibilityCheck, Boolean doCheckConsistency) 
    at System.Reflection.RtFieldInfo.InternalGetValue(Object obj, Boolean doVisibilityCheck) 
    at System.Reflection.RtFieldInfo.GetValue(Object obj) 

Je peux contourner cette erreur en créant une sous-classe de la classe en utilisant la réflexion et redéfinissant la méthode utilisant la réflexion comme ceci:

public class InitialXAP.ClassUsingReflection { 

     public virtual object GetValue() 
     { 
      return fieldInfo.GetValue(parent); 
     } 
} 

public class ClassUsingReflection : InitialXAP.ClassUsingReflection { 

     public override object GetValue() 
     { 
      return fieldInfo.GetValue(parent); 
     } 
} 

Mais je préférerais éviter cette duplication en autorisant la réflexion de l'InitialXAP dans DynamicXAP. Des idées sur ce que je peux faire?

Répondre

1

Bien qu'il existe une courbe d'apprentissage, je voudrais regarder Silverlight MEF ou Prism (les deux sont enfin ensemble dans la dernière Prism 4 Beta). Ils supportent tous deux le chargement dynamique des modules et appliquent de bons modèles pour la réutilisation et le développement séparé/d'équipe.

+0

-1 pour avoir suggéré une alternative? Donc, fondamentalement, suggérer que ce n'est peut-être pas la meilleure façon de s'y prendre n'est pas une réponse utile. C'est suffisant. Peut-être que les critiques devraient réellement fournir une réponse à "cette façon de le faire" s'ils se sentent si fortement à ignorer les alternatives :) –

+0

Plus un, parce qu'il est une alternative viable et meilleure ... – stevenrcfox

+0

Explication pour mon vote vers le bas: je lis à travers 'un peu de doc Prism et je ne pouvais rien trouver là-bas qui semblait me permettre de faire des appels croisés XAP ou de câbler des contrôles utilisateur par convention. (Peut-être que j'ai raté quelque chose et vous pourriez me montrer le bit pertinent?). En l'absence de cela, il m'a semblé que ce n'était pas vraiment une réponse valable à ma question. Et non, je n'ai pas de meilleure façon non plus - en ce moment, je vis juste avec la petite quantité de duplication, de sorte que je peux avoir la liaison automatique basée sur la convention - il semble que le moindre mal. – Rohith

0

InitialXAP.ClassUsingReflection ...

Notez le double ne fait pas partie de l'espace de noms xap inital (ClassUsingReflection), et peuvent être importés. Remarquez GetVisible - comme non visible à Dynamic xap ... Quittez simplement le duplicata (emmenez évidemment la classe de base) et essayez.

+1

Désolé, je n'ai pas compris votre réponse. Pouvez-vous expliquer un peu plus? Je ne veux pas enlever la classe de base - la classe de base serait utilisée dans le InitialXap pour la même raison. – Rohith

Questions connexes