2016-11-23 132 views
-1

編輯:我犯了一個錯誤,前提是錯誤的。 typeof(T).IsClass確實可行 - 正如所指出的那樣,typeof(T)IsInterface也是如此。在C#中,如何判斷泛型類型T是否(不實現!)接口?

說我有這樣的方法:

public T GetService<T>() where T : IService 

我想測試通用型,T是否被送入該方法的接口,而不是作爲一個階級。換句話說,我想區分來自MyClass.GetService<IService>()MyClass.GetService<ImplementingClass>()的電話。我怎樣才能做到這一點?

我嘗試使用is objectis System.Object,但它不會作出此區別。使用typeof(T).IsClassdefault(T).IsClass也不起作用,因爲分別返回類型System.Type始終是一個類,並且IsClass不可用於默認的T.

我該怎麼辦?

+0

你試過簡單的轉換,然後檢查是否爲空? http://stackoverflow.com/questions/13405714/is-versus-try-cast-with-null-check –

+0

在你的情況下,如果不引發編譯器異常,對象T總是應該實現IService。所以我不明白你的問題。 – mybirthname

+0

我實際上並不是想知道T是否實現了接口,我想阻止類的用戶使用實現調用此方法 - 它們應該使用接口返回類型。 – Joseph

回答

0

事實證明我的前提是錯誤的。這確實有效:

typeof(T).IsClass 

如果指定了接口,則返回false。

1

我測試了你的case,typeof(T).IsClass does not work