2010-01-13 7 views
6

Ho un'applicazione Silverlight che ha due XAP diversi: un InitialXAP che viene caricato staticamente dalla pagina HTML e un DynamicXAP che viene caricato dal codice all'interno dell'XAP iniziale. Il DynamicXAP viene caricato con codice simile a questo:Silverlight: non è possibile utilizzare la riflessione su GetValue di un campo attraverso XAPs?

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); 

Ho una classe che utilizza la riflessione (specificamente FieldInfo.GetValue) fare associazione dati. Questa classe è definita in InitialXAP. Se cerco di utilizzare questa classe nel DynamicXAP, ottengo un errore:

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) 

posso ottenere intorno a questo errore con la creazione di una sottoclasse della classe utilizzando la riflessione e l'override del metodo utilizzando la riflessione in questo modo:

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); 
     } 
} 

Ma preferirei evitare questa duplicazione consentendo il riflesso da InitialXAP in DynamicXAP. Qualche idea su cosa posso fare?

risposta

1

Anche se c'è una curva di apprendimento, vorrei guardare a Silverlight MEF o Prism (entrambi sono finalmente insieme nell'ultimo Prism 4 Beta). Entrambi supportano il caricamento dinamico dei moduli e impongono buoni schemi per il riutilizzo e lo sviluppo separato/del team.

+0

-1 per suggerire un'alternativa? Quindi sostanzialmente suggerire che questo potrebbe non essere il modo migliore per farlo non è una risposta utile. Giusto. Forse i critici dovrebbero in realtà fornire una risposta a "quel modo di farlo" se si sentono così fortemente nell'ignorare alternative :) –

+0

Più uno, perché è un'alternativa valida e migliore ... – stevenrcfox

+0

Spiegazione per il mio voto negativo: ho letto attraverso 'un bel po' del prisma doc e non sono riuscito a trovare nulla che mi sembrasse mi avrebbe permesso di fare chiamate XAP incrociate o collegare controlli utente tramite convenzione. (Forse mi sono perso qualcosa e potresti indicarmi il bit pertinente?). In assenza di questo, mi è sembrato che questa non sia una risposta veramente valida per la mia domanda. E no, non ho neanche un modo migliore - in questo momento, sto vivendo solo con la piccola quantità di duplicazione, in modo che possa avere l'auto-binding basato sulla convenzione - sembra il male minore. – Rohith

0

InitialXAP.ClassUsingReflection ...

Nota il duplicato non è parte del inital xap namespace (ClassUsingReflection), e possono essere importati. Avviso GetVisible - come non visibile a Dynamic xap ... Basta lasciare il duplicato (portare via la classe base ovviamente) e provare.

+1

Scusa, non ho capito la tua risposta. Puoi spiegare un po 'di più? Non voglio portare via la classe base - la classe base verrebbe usata in InitialXap per lo stesso motivo. – Rohith

Problemi correlati