如果你考虑:
class A : IInterface { }
在运行时:
A instance = new A();
instance.GetType(); // returns "A"
或
IInterface instance = new A();
instance.GetType(); // returns "A"
或
object instance = new A();
instance.GetType(); // returns "A"
问题:如何将IInterface
作为类型?
答案 0 :(得分:8)
instance.GetType().GetInterfaces()
将获取实例类型(Type.GetInterfaces Method)实现或继承的所有接口。
答案 1 :(得分:2)
GetType()将始终为您提供具有实例的类的类型,无论您具有何种类型的引用。你已经在你的问题中发现了这一点。
如果你总是希望获得IInterface的类型对象,你也可以使用
typeof(IInterface)
如果需要该类型实现的接口列表,可以使用
instance.GetType().GetInterfaces()
答案 2 :(得分:2)
检查Type.GetInterface
方法:
您需要检查对象是否实现了这样的接口,而不是尝试获取某个接口对象。如果是这样,你可以将它转换为接口类型,或者,如果你想将类型打印到某个流,如果它实现了接口,则打印它的字符串表示。
您可以实施下一个扩展方法,以便让生活更轻松:
public static bool Implements<T>(this Type some)
{
return typeof(T).IsInterface && some.GetInterfaces().Count(someInterface => someInterface == typeof(T)) == 1;
}
最后,你可以这样做:
Type interfaceType = someObject.GetType().Implements<IInterface>() ? typeof(IInterface) : default(Type);
答案 3 :(得分:1)
请参阅Scott Hanselmans关于该主题的非常好的文章:
http://www.hanselman.com/blog/DoesATypeImplementAnInterface.aspx
Type type = instance.GetType()
Type[] ifaces = type.GetInterfaces()
应该解决你的问题。
答案 4 :(得分:1)
如果您需要检查特定界面,可以使用'is'关键字 if(实例是IInterface) //做点什么