2013-10-04 14 views
7

我懷疑這個問題的簡短答案是「否」,但我對在C#4.0運行時檢測動態關鍵字的使用感興趣,特別是作爲方法的通用類型參數。在運行時檢測到使用「動態」關鍵字作爲類型參數

給予一定的背景下,我們有一個RESTClient實現類中我們的許多項目,這需要一個類型參數指定反序列化時的反應應該使用的類型,例如共享庫:

public IRestResponse<TResource> Get<TResource>(Uri uri, IDictionary<string, string> headers) 
    where TResource : new() 
{ 
    var request = this.GetRequest(uri, headers); 
    return request.GetResponse<TResource>(); 
} 

不幸的是(由於原因,我不會進入這裏爲簡潔起見)使用動態作爲類型參數爲了返回一個動態類型不能正常工作 - 我們必須添加第二個簽名該類返回動態響應類型:

public IRestResponse<dynamic> Get(Uri uri, IDictionary<string, string> headers) 
{ 
    var request = this.GetRequest(uri, headers); 
    return request.GetResponse(); 
} 

但是,使用動態作爲第一種方法的類型參數會導致一個非常奇怪的錯誤,它掩蓋了實際的問題並使整個調試變得很頭疼。爲了幫助其他程序員使用API​​,我想嘗試在第一個方法中檢測動態的使用情況,以便它完全不會編譯,或者在使用異常時拋出異常如果您想要動態響應類型,請使用「使用其他方法」。

基本上之一:

public IRestResponse<TResource> Get<TResource>(Uri uri, IDictionary<string, string> headers) 
    where TResource is not dynamic 

public IRestResponse<TResource> Get<TResource>(Uri uri, IDictionary<string, string> headers) 
    where TResource : new() 
{ 
    if (typeof(TResource).isDynamic()) 
    { 
      throw new Exception(); 
    } 

    var request = this.GetRequest(uri, headers); 

    return request.GetResponse<TResource>(); 
} 

要麼這些事情可能嗎?我們使用VS2010和.Net 4.0,但如果可以使用更新的語言功能,我會對.Net 4.5解決方案感興趣以備將來參考。

+0

當用戶指定'dynamic'時,'TResource'在運行時就是'object'。用戶會不會嘗試「獲取'?這是否需要與「獲得」不同? –

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

@TimS。是的,使用獲得是潛在的好 - 我不想冒犯,如果我不必... –

回答

3

當有人這樣做Get<dynamic>,在運行時TResourceobject。只要Get<object>不是您的用戶真正想要做的事情,您可以檢查TResource是否爲object以捕獲兩個意外情況(objectdynamic)。

public IRestResponse<TResource> Get<TResource>(Uri uri, IDictionary<string, string> headers) 
    where TResource : new() 
{ 
    if (typeof(TResource) == typeof(object)) 
    { 
     throw new Exception("Use the dynamic one"); 
    } 

    var request = this.GetRequest(uri, headers); 

    return request.GetResponse<TResource>(); 
} 
+0

正如上面的評論中指出的,我想避免使用outlawing如果可能,獲取 ... –

相關問題