我有一个 Silverlight 应用程序,它有两个不同的 XAP——一个由 HTML 页面静态加载的 InitialXAP 和一个从初始 XAP 中的代码加载的 DynamicXAP。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);
}
}
但我更愿意通过允许 DynamicXAP 中的 InitialXAP 进行反射来避免这种重复。关于我能做什么的任何想法?