我有一個Silverlight應用程序,它有兩個不同的XAP - 由HTML頁面靜態加載的InitialXAP和從初始XAP中的代碼加載的DynamicXAP。所述DynamicXAP裝有類似於以下代碼:Silverlight:不能使用反射到跨XAP的字段的GetValue?
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進行反射來避免此重複。關於我能做什麼的任何想法?
-1爲暗示替代?所以基本上表明這可能不是最好的解決方法並不是一個有用的答案。很公平。也許批評家實際上應該爲「這樣做的方式」提供一個答案,如果他們對如何忽略替代品感到如此強烈:) – 2010-08-25 09:39:58
再加上一個,因爲它是一個可行的,更好的選擇... – stevenrcfox 2010-09-08 16:48:34
解釋爲我的投票:我讀通過「這是普利茅斯文檔的一小部分,我找不到任何可以讓我做XAP調用或者通過約定連接用戶控件的東西。 (也許我錯過了一些東西,你可以指點我的相關位?)。在沒有這個的情況下,在我看來,這不是對我的問題真正有效的答案。不,我也沒有更好的辦法 - 現在,我只是生活在少量的重複中,這樣我就可以根據慣例進行自動綁定 - 看起來像是小惡。 – Rohith 2010-10-01 07:32:23