2012-11-01 25 views
0

當我調用該方法時,以下代碼失敗。沒有例外;一切都崩潰了。此代碼位於Windows Phone 7可移植類庫中,有什麼想法發生了什麼?Windows Phone中的反射

public static object Deserialize(string input, Type type) 
{ 
    var castMethod = typeof(ModelBase).GetMethod("Cast").MakeGenericMethod(type); 
    object castedObject = castMethod.Invoke(null, new object[] { input }); 
    return castedObject; 
} 

public static T Cast<T>(string input) 
{ 
    return JsonConvert.DeserializeObject<T>(input); 
} 

回答

1

簡短的回答:

你不需要反射這裏的。您可以通過簡單地撥打JsonConvert.DeserializeObject(string, Type)替換您的Deserialize(string, Type)方法(並擺脫Cast<T>)。

較長答案:

Cast<T>方法不必要地複雜的事情:

  • 它有一個類型參數T並返回一個T對象/值,但調用方法(Deserialize)沒有按」無論如何,我不關心這件事。它返回一個「無類型」object,所以Cast也可以返回object

  • 必須將Type對象轉換爲T的相應類型參數意味着您需要進行一些類型反射。但是,如果Cast<T>不是通用的—,並且如上所述,它不一定是—,您不需要所有的反思。

  • 事實證明,Json.NET不需要類型參數TJsonConvert.DeserializeObject有一個非泛型的「過載」,它接受一個Type對象。

因此,擺脫你的Cast<T>方法和你的反射彎路和簡單地使用非通用JsonConvert.DeserializeObject(string, Type)超載。

PS:關於你的原來的問題,根據ECMA-335標準,該標準描述了CLI(其由.NET,.NET緊湊,Silverlight和WP7實現),反射是不內核的一部分圖書館,但一個單獨但可選的圖書館。如果它在特定平臺上不存在(例如WP7,AFAIK),則Type對象本質上將被視爲不透明的對象,您無法從中導出其他Type實例。

+0

是的我在大概10分鐘後發現了這個問題:P 感謝您的詳細分析。 – Dharun

+0

此外,演員實際上是必需的,因爲一旦我把它拿回來,我對該物體做了什麼,它是一個「對象」,但它仍然是鍵入的。太晦澀瞭解釋,但是Json.NET中的DeserializeObject重載正是我所需要的。 – Dharun