2012-11-03 81 views
3

我正在實現一個自定義的(和通用的)Json.net序列化程序,並在路上碰到一個碰撞,我可以使用一些幫助。得到一個實現接口的「默認」具體類

當反序列化器映射到一個屬性是一個接口時,我怎樣才能最好地確定構建要反序列化以放入接口屬性的對象類型。

我有以下幾點:

[JsonConverter(typeof(MyCustomSerializer<foo>))] 
class foo 
{ 
    int Int1 { get; set; } 
    IList<string> StringList {get; set; } 
} 

我的串行正確序列化這個對象,但是當它回來的,我嘗試了JSON部分映射到反對,我有一個JArray和接口。

我目前實例什麼枚舉像列表爲

theList = Activator.CreateInstance(property.PropertyType); 

該作品創造與反序列化過程中的工作,但是當屬性的IList,我得到運行時投訴(顯然)關於不能夠實例化一個接口。

那麼我怎麼會知道在這種情況下要創建什麼類型的具體類?

謝謝

回答

2

您可以創建一個映射到你認爲哪個類型應該是默認的界面(「一個接口默認類型」是不是在語言定義的概念)的字典:

var defaultTypeFor = new Dictionary<Type, Type>(); 
defaultTypeFor[typeof(IList<>)] = typeof(List<>); 
... 
var type = property.PropertyType; 
if (type.IsInterface) { 
    // TODO: Throw an exception if the type doesn't exist in the dictionary 
    if (type.IsGenericType) { 
     type = defaultTypeFor[property.PropertyType.GetGenericTypeDefinition()]; 
     type = type.MakeGenericType(property.PropertyType.GetGenericArguments()); 
    } 
    else { 
     type = defaultTypeFor[property.PropertyType]; 
    } 
} 
theList = Activator.CreateInstance(type); 

(我還沒有試過這段代碼,請告訴我,如果您遇到問題。)

+1

謝謝。這確實奏效,我添加了使用TryGetValue的邏輯並拋出一個未找到的異常。 –

+0

@RogerJoys:燦爛! –

相關問題