2010-01-13 17 views
6

Tengo una aplicación Silverlight que tiene dos XAP diferentes: un InitialXAP que se carga estáticamente por la página HTML y un DynamicXAP que se carga desde el código dentro del XAP inicial. El DynamicXAP está cargado con un código similar a esto:Silverlight: ¿No se puede usar el reflejo en GetValue de un campo en 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); 

tengo una clase que utiliza la reflexión (específicamente FieldInfo.GetValue) para hacer los datos de unión. Esta clase se define en InitialXAP. Si trato de utilizar esta clase en el DynamicXAP, me sale un error:

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) 

puedo solucionar este error creando una subclase de la clase mediante la reflexión y reemplazando el método utilizando la reflexión de este 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); 
     } 
} 

Pero preferiría evitar esta duplicación al permitir la reflexión desde InitialXAP en DynamicXAP. ¿Alguna idea sobre lo que puedo hacer?

Respuesta

1

Aunque hay una curva de aprendizaje, me gustaría ver Silverlight MEF o Prism (ambos están juntos por fin en el último Prism 4 Beta). Ambos admiten la carga dinámica de módulos y hacen cumplir buenos patrones para la reutilización y el desarrollo de equipos/por separado.

+0

-1 ¿por sugerir una alternativa? Entonces, básicamente, sugerir que esta podría no ser la mejor manera de hacerlo no es una respuesta útil. Lo suficientemente justo. Quizás los críticos en realidad deberían dar una respuesta a "esa manera de hacerlo" si sienten una gran inclinación a ignorar las alternativas :) –

+0

Además uno, porque es una alternativa viable y mejor ... – stevenrcfox

+0

Explicación de mi voto negativo: Lo leí "un poco del documento de Prism y no pude encontrar nada allí que parecía que me permitiría hacer llamadas XAP cruzadas o cablear los controles del usuario por convención. (Tal vez me perdí algo y ¿podrías señalarme el tema relevante?). En ausencia de esto, me pareció que esta no es una respuesta válida para mi pregunta. Y no, tampoco tengo una mejor manera. En este momento, solo estoy viviendo con la pequeña cantidad de duplicaciones, por lo que puedo tener enlaces automáticos según las convenciones, parece el mal menor. – Rohith

0

InitialXAP.ClassUsingReflection ...

Nota del duplicado no es parte del espacio de nombres xap inital (ClassUsingReflection), y puede ser importado. Aviso GetVisible - como en no visible para Dynamic xap ... Simplemente deja el duplicado (quita la clase base obviamente) y prueba.

+1

Lo siento, no entendí tu respuesta. ¿Puedes explicar un poco más? No quiero quitar la clase base: la clase base se usaría en InitialXap por la misma razón. – Rohith

Cuestiones relacionadas