Silverlight: невозможно использовать отражение для получения значения поля в XAP?

У меня есть приложение 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. Есть идеи, что я могу сделать?


person Rohith    schedule 13.01.2010    source источник


Ответы (2)


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

person Gone Coding    schedule 19.08.2010
comment
-1 за предложение альтернативы? Так что в основном предполагать, что это может быть не лучший способ решить эту проблему, не является полезным ответом. Справедливо. Возможно, критикам стоит дать ответ на этот способ, если они так решительно игнорируют альтернативы :) - person Gone Coding; 25.08.2010
comment
Объяснение моего голоса против: я прочитал изрядную часть документа Prism и не смог найти там ничего, что могло бы позволить мне выполнять перекрестные вызовы XAP или подключать пользовательские элементы управления по соглашению. (Может быть, я что-то упустил, и вы могли бы указать мне на соответствующий фрагмент?). В отсутствие этого мне показалось, что это не совсем верный ответ на мой вопрос. И нет, у меня тоже нет лучшего способа - прямо сейчас я просто живу с небольшим количеством дублирования, так что у меня может быть автоматическая привязка на основе соглашения - это похоже на меньшее зло. - person Rohith; 01.10.2010
comment
+1, поскольку я также поддерживаю Prism / MEF как лучшую альтернативу отражению для внешних файлов XAP. - person Murven; 08.11.2010
comment
Хм, похоже, это превратилось в тему поддержки Prism. Как насчет более подробного объяснения того, как Prism решает изначально заданную проблему? - person Rohith; 21.11.2010

InitialXAP.ClassUsingReflection...

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

person Not applicable    schedule 19.10.2010
comment
Извините, я не понял вашего ответа. Не могли бы вы объяснить немного больше? Я не хочу убирать базовый класс - базовый класс будет использоваться в InitialXap по той же причине. - person Rohith; 20.10.2010