2009-07-15 111 views
1

我有一個方法:檢測接口的泛型類型

public void StoreUsingKey<T>(T value) where T : class, new() { 
     var idModel = value as IIDModel; 
     if (idModel != null) 
      Store<T>(idModel); 

     AddToCacheUsingKey(value); 
    } 

,我想有選擇地調用下面的方法的基礎上,value參數的實施IIDModel

public void Store<T>(T value) where T : class, IIDModel, new() { 
     AddModelToCache(value); 
    } 

有沒有辦法告訴Store<T>StoreUsingKey<T>value參數實現IIDModel?或者我正在以這種錯誤的方式去做?

回答

卸下從每種方法的new()約束允許代碼工作。問題在於我試圖將接口作爲可實例化的對象傳遞。

回答

1

從每種方法中刪除new()約束允許代碼工作。問題在於我試圖將接口作爲可實例化的對象傳遞。

5

你已經是。通過在商店< T>方法上放置IIDModel約束,您可以保證值參數實現了IIDModel。

哦,好的,我明白你現在說的話。這個怎麼樣:

public void StoreUsingKey<T>(T value) where T : class, new() { 
       if (idModel is IIDModel) 
         Store<T>((IIDModel)idModel); 

       AddToCacheUsingKey(value); 
     } 

編輯再次: Tinister是正確的。這本身不會做到這一點。但是,如果您的Store方法看起來像Joel Coehoorn posted,那麼它應該工作。

+0

但是StoreUsingKey 方法沒有這個約束。我如何選擇致電店鋪?上例中的錯誤「無法從'IIDModel'轉換爲'T'」。 – kim3er 2009-07-15 15:43:27

+0

這似乎並不奏效:'IIDModel'必須是具有公共無參數構造函數的非抽象類型,才能在通用類型或方法'Store (T)' – Tinister 2009-07-15 16:33:21

2
public void Store(IIDModel value) { 
    AddModelToCache(value); 
}