Silverlight: Не удается использовать отражение для GetValue поля в XAP? - PullRequest
6 голосов
/ 13 января 2010

У меня есть приложение Silverlight, которое имеет два разных XAP - InitialXAP, который статически загружается HTML-страницей, и DynamicXAP, который загружается из кода в исходном XAP. DynamicXAP загружается с кодом, подобным этому:

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

У меня есть класс, который использует отражение (в частности, FieldInfo.GetValue) для привязки данных. Этот класс определен в InitialXAP. Если я пытаюсь использовать этот класс в DynamicXAP, я получаю сообщение об ошибке:

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)

Я могу обойти эту ошибку, создав подкласс класса с использованием отражения и переопределив метод с помощью отражения следующим образом:

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

Но я бы предпочел избежать этого дублирования, разрешая отражение от InitialXAP в DynamicXAP. Любые идеи о том, что я могу сделать?

Ответы [ 2 ]

1 голос
/ 19 августа 2010

Несмотря на то, что есть кривая обучения, я бы посмотрел на Silverlight MEF или Prism (наконец-то они вместе в последней Prism 4 Beta ). Они оба поддерживают динамическую загрузку модулей и обеспечивают хорошие шаблоны для повторного использования и отдельной / групповой разработки.

0 голосов
/ 20 октября 2010

InitialXAP.ClassUsingReflection ...

Обратите внимание, что дубликат не является частью начального xap пространства имен (ClassUsingReflection) и может быть импортирован. Замечание GetVisible - как в невидимом для динамического xap ... Просто оставьте дубликат (очевидно, заберите базовый класс) и попробуйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...