locked
Type.GetType是否可以適用所有的class RRS feed

  • 問題

  • 我要輸出XML以attribute的格式將所有的屬性都列在同一行,但是會出現以下的錯誤訊息

    Microsoft JScript runtime error: Unhandled Error in Silverlight Application Object reference not set to an instance of an object.
    關鍵點就是以下這一行程式,我希望可以獲得Color的每一個屬性的名稱,但是我失敗了,請問我要如何解決?

    myPropertyInfo = Type.GetType("System.Windows.Media.Color").GetProperties();//

    static public bool SaveXML(UIPage uiPage,string szFielname)
        {
    			bool bUseAttrMode=true;
    			
    			var attrOverrides=new System.Xml.Serialization.XmlAttributeOverrides();
    			
    			if (bUseAttrMode==true)
    			{
    				{
    					PropertyInfo[] myPropertyInfo;
    					// Get the properties of 'Type' class object.
    					myPropertyInfo = Type.GetType("System.Windows.Media.Color").GetProperties();//<==problem
    					Console.WriteLine("Properties of System.Type are:");
    					for (int i = 0; i < myPropertyInfo.Length; i++)
    					{
    						Console.WriteLine(myPropertyInfo[i].ToString());
    
    					  attrOverrides.Add(typeof(Color), myPropertyInfo[i].ToString(), new System.Xml.Serialization.XmlAttributes() { XmlAttribute = new System.Xml.Serialization.XmlAttributeAttribute(myPropertyInfo[i].ToString()) });
    					}
    				}
    

    akira32 編程之家 Yahoo http://tw.myblog.yahoo.com/akira32-akira32
    2011年3月5日 下午 12:59

解答

  • 這是個很好玩的問題,之前我在處理SL序列化問題時也遇到.

    簡單說明我所了解的如下
    因為SL因為需要精簡runtim所以預設client安裝的runtime只包含特定的dll(這些dll就是在建立SL專案時預設參考的那些,copy to local設為false).
    但並不是所有SL SDK中的dll都包含於runtime內,故如果參考其他的dll就必須設copy to local設為true.透過xap來發佈.

    而這些dll由於包含在xap中故必須透過下載程序才會取得,而SL的AP並不會直接就下載相關dll,這也就是為何SL中沒有GetAssemblies這類函式.
    所以必須透過底下方式先取得xap的資訊再一一剖析取得.
                foreach (System.Windows.AssemblyPart ap in System.Windows.Deployment.Current.Parts)
                {
                    System.Windows.Resources.StreamResourceInfo sri = System.Windows.Application.GetResourceStream(new Uri(ap.Source, UriKind.Relative));
                    System.Reflection.Assembly assembly = new System.Windows.AssemblyPart().Load(sri.Stream);

                    Type type = assembly.GetType("xxx.xxx.xxx", false);
                    if (type != null)
                    {
                     ....
                    }
                }

    但不幸的上面的程式碼取得的是非內建的dll來做反射,而包含於Runtime的無法透過此方式取得,而重點在於SL居然沒有方式能夠取得Runtime內的dll參照,(這點我上過官方MSDN詢問過也找遍資料找不到方式).
    所以必須透過一種迂迴的方式.
    譬如說如果要取得System.Core.dll可以先隨便找一個存在於此dll中的class(譬如說Action)然後透過
    typeof(Action).Assembly取得assembly的class參照,然後再用此取得其他同樣於System.Core.dll內的class做反射.
    幸好SL Runtime包含的dll並不多....

    而你的Color剛好在System.Windows.dll屬於runtime的一部分,所以也必須透過此方式來處理.

    以上為如果需要動態透過字串加載時處理,如果已知class type則直接用阿尼的方式處理即可.

     

    • 已標示為解答 akira32 2011年3月7日 下午 03:51
    2011年3月7日 上午 07:50

所有回覆

  • typeof(System.Windows.Media.Color)
    2011年3月5日 下午 01:11
  • 這是個很好玩的問題,之前我在處理SL序列化問題時也遇到.

    簡單說明我所了解的如下
    因為SL因為需要精簡runtim所以預設client安裝的runtime只包含特定的dll(這些dll就是在建立SL專案時預設參考的那些,copy to local設為false).
    但並不是所有SL SDK中的dll都包含於runtime內,故如果參考其他的dll就必須設copy to local設為true.透過xap來發佈.

    而這些dll由於包含在xap中故必須透過下載程序才會取得,而SL的AP並不會直接就下載相關dll,這也就是為何SL中沒有GetAssemblies這類函式.
    所以必須透過底下方式先取得xap的資訊再一一剖析取得.
                foreach (System.Windows.AssemblyPart ap in System.Windows.Deployment.Current.Parts)
                {
                    System.Windows.Resources.StreamResourceInfo sri = System.Windows.Application.GetResourceStream(new Uri(ap.Source, UriKind.Relative));
                    System.Reflection.Assembly assembly = new System.Windows.AssemblyPart().Load(sri.Stream);

                    Type type = assembly.GetType("xxx.xxx.xxx", false);
                    if (type != null)
                    {
                     ....
                    }
                }

    但不幸的上面的程式碼取得的是非內建的dll來做反射,而包含於Runtime的無法透過此方式取得,而重點在於SL居然沒有方式能夠取得Runtime內的dll參照,(這點我上過官方MSDN詢問過也找遍資料找不到方式).
    所以必須透過一種迂迴的方式.
    譬如說如果要取得System.Core.dll可以先隨便找一個存在於此dll中的class(譬如說Action)然後透過
    typeof(Action).Assembly取得assembly的class參照,然後再用此取得其他同樣於System.Core.dll內的class做反射.
    幸好SL Runtime包含的dll並不多....

    而你的Color剛好在System.Windows.dll屬於runtime的一部分,所以也必須透過此方式來處理.

    以上為如果需要動態透過字串加載時處理,如果已知class type則直接用阿尼的方式處理即可.

     

    • 已標示為解答 akira32 2011年3月7日 下午 03:51
    2011年3月7日 上午 07:50