2016-11-23 127 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