2010-01-13 46 views
6

我有一個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

雖然有學習曲線,但我會看Silverlight MEF或棱鏡(兩者都在最後在最後Prism 4 Beta)在一起。它們都支持模塊的動態加載,併爲重用和分離/團隊開發實施良好的模式。

+0

-1爲暗示替代?所以基本上表明這可能不是最好的解決方法並不是一個有用的答案。很公平。也許批評家實際上應該爲「這樣做的方式」提供一個答案,如果他們對如何忽略替代品感到如此強烈:) – 2010-08-25 09:39:58

+0

再加上一個,因爲它是一個可行的,更好的選擇... – stevenrcfox 2010-09-08 16:48:34

+0

解釋爲我的投票:我讀通過「這是普利茅斯文檔的一小部分,我找不到任何可以讓我做XAP調用或者通過約定連接用戶控件的東西。 (也許我錯過了一些東西,你可以指點我的相關位?)。在沒有這個的情況下,在我看來,這不是對我的問題真正有效的答案。不,我也沒有更好的辦法 - 現在,我只是生活在少量的重複中,這樣我就可以根據慣例進行自動綁定 - 看起來像是小惡。 – Rohith 2010-10-01 07:32:23

0

InitialXAP.ClassUsingReflection ...

注意重複不是inital xap命名空間(ClassUsingReflection)的一部分,並且可以被引入。 注意GetVisible - 在動態xap中不可見... 只留下重複(明顯帶走基類)並嘗試。

+1

對不起,我不明白你的答案。你能多解釋一下嗎?我不想帶走基類 - 基類會在InitialXap中用於同樣的原因。 – Rohith 2010-10-20 04:31:45