如何判断一个类型是否继承了另一个不包含任何泛型类型参数的类型?

时间:2014-06-11 17:11:29

标签: c# reflection types

我有以下内容:

public interface IContract
{
     //...
}
public interface IContractChannel : IContract, IClientChannel 
{
    //....
}

public class myClient : System.ServiceModel.ClientBase<IContractChannel>
{
   ///...
}

我需要确定我的客户端是否在运行时是ClientBase类型。我正在尝试

 myClientType.IsSubClassOf(ClientBase<IClientChannel>);

它返回false。我手头没有IContractChannel类型。我怎么知道我的类型是否继承了ClientBase?

3 个答案:

答案 0 :(得分:2)

ClientBase<IContractChannel>ClientBase<IClientChannel>的类型不同,IContractChannel继承自IClientChannel,但并不意味着ClientBase<IContractChannel>继承自ClientBase<IClientChannel> }。当模板类实例化时,它们是不同的类型。

所以它应该是假的。

你想要实现的目标,这是一个术语:逆变。在MSDN中,有一个主题:Covariance and Contravariance in Generics。 Contravariance使您可以使用比最初指定的更通用(更少派生)的类型,例如您可以将IEnumerable<Base>的实例分配给IEnumerable<Derived>类型的变量。

在C#中,您可以create Variant Generic Interfaces支持Contravariance,但对于您来说,通用界面已经存在。

答案 1 :(得分:2)

你可能正在寻找的是:

Console.WriteLine(myClientType.BaseType.GetGenericTypeDefinition() 
  == typeof(ClientBase<>));

DotNetFiddle Example

答案 2 :(得分:0)

您可以查看频道myClient.Channel.GetType()的类型,也可以查看myClientType.GenericTypeArguments以获取TChannel类型,然后进行检查。