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



我有以下内容:

public interface IContract
{
     //...
}
public interface IContractChannel : IContract, IClientChannel 
{
    //....
}
public class myClient : System.ServiceModel.ClientBase<IContractChannel>
{
   ///...
}

我需要在运行时确定我的客户端是否为ClientBase类型。I'm try

 myClientType.IsSubClassOf(ClientBase<IClientChannel>);

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

你可能要找的是:

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

DotNetFiddle例子。

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

所以它应该是假的

你想要达到的,这是一个术语:逆变。在MSDN中,有一个关于此的主题:泛型中的协方差和逆变变。逆变性使您能够使用比最初指定的更泛型(更少派生)的类型,例如您可以将IEnumerable<Base>的实例分配给IEnumerable<Derived>类型的变量。

在c#中,您可以创建变体泛型接口来支持逆变,但是对于您的情况,泛型接口已经存在了。

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

相关内容

  • 没有找到相关文章

最新更新