在运行时获取继承的对象类型

时间:2011-06-22 12:33:36

标签: c# inheritance reflection interface types

如果你考虑:

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作为类型?

5 个答案:

答案 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)             //做点什么