我有以下内容:
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类型,然后进行检查。