2015-07-19 73 views
2

我有一個方法採用泛型類型,對API執行休息查詢並返回序列化對象。在代碼中檢測動態類型?

它工作的很好,但是,我想擴展它以便在調用沒有預定義類型的API時創建動態對象。

我有這個工作與唯一的變化是一個自定義的反序列化器,但是,我不得不基本上覆制/粘貼我的方法與一個不同的名稱,因爲我不能找出一種檢測類型爲動態的方法。

一個小例子:

public T PerformQuery<T>() 
{ 
    var deserializer = new JsonDeserializer(); 
    var res = deserializer.Deserialize<T>(response); 
    return res; 
} 

public Dynamic PerformQueryDynamic() 
{ 
    var deserializer = new DynamicJsonDeserializer(); 
    var res = deserializer.Deserialize<T>(response); 
    return res; 
} 

我想什麼:

public T PerformQuery<T>() 
{ 
    if(Typeof(T) == Typeof(Dynamic)) 
     var deserializer = new DynamicJsonDeserializer();   
    else 
     var deserializer = new JsonDeserializer(); 

    var res = deserializer.Deserialize<T>(response); 
    return res; 
} 

我讀過其他職位在這裏,我明白爲什麼TYPEOF不與充滿活力的工作,但是,我是想知道是否有什麼可以做我想在這裏做的?在這種方法中還有其他的東西,比如Oauth調用和類似的東西,如果我可以把它作爲一種方法的話,它會變得更加整潔。

...沒有一個解決方案,我想只是添加一個布爾到構造函數,但是,如果有答案,似乎是一種浪費。

+0

這樣的方式如何:[如何檢查泛型參數是否在.NET 4.0中是動態的](http://stackoverflow.com/questions/3277419/how-to-check-if-a-generic-parameter-是 - 動態在網絡4-0)? – har07

回答

2

沒有dynamic類型。它是動態呼叫站點周圍的所有語法糖。編譯器將在下面替換dynamicobject

正如我想象反序列化object(沒有字段)是沒有意義的,你可以解決此通過使用:

public T PerformQuery<T>(string response) 
{ 
    if (typeof(T) == typeof(object)) 
     return new DynamicJsonDeserializer().Deserialize<T>(response); 

    return new JsonDeserializer().Deserialize<T>(response); 
} 

所以PerformQuery<object>將工作一樣PerformQuery<dynamic>,但就像我說的,這不應該這不是一個問題。