我有以下内容:
public interface IContract
{
//...
}
public interface IContractChannel : IContract, IClientChannel
{
//....
}
public class myClient : System.ServiceModel.ClientBase<IContractChannel>
{
///...
}
我需要确定我的客户端是否在运行时是ClientBase类型。我正在尝试
myClientType.IsSubClassOf(ClientBase<IClientChannel>);
它返回false。我手头没有IContractChannel类型。我怎么知道我的类型是否继承了ClientBase?
答案 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<>));
答案 2 :(得分:0)
您可以查看频道myClient.Channel.GetType()
的类型,也可以查看myClientType.GenericTypeArguments
以获取TChannel类型,然后进行检查。