应该很容易......
class Base{}
class Foo:Base{}
public bool Bar(Type t){
// return ???
// NB: shouldn't know anything about Foo, just Base
}
Assert.True(Bar(typeof(IEnumerable<Foo>));
Assert.False(Bar(typeof(IEnumerable<Base>));
Assert.False(Bar(typeof(string));
Assert.False(Bar(typeof(Foo));
回答问题为什么第二个应该是假的(实际上 - 这没关系,因为Bar参数永远不会是IEnumerable<Base>
)。
我正在尝试编写FluentNhibernate自动映射约定,它将我的类枚举映射到整数。我已经成功地做到了,但是当我想要映射IEnumerable<EnumerationChild>
(在我的情况下是User.Roles)时,事情就失败了。
public class EnumerationConvention:IUserTypeConvention{
private static readonly Type OpenType=typeof(EnumerationType<>);
public void Apply(IPropertyInstance instance){
//this is borked atm, must implement ienumerable case
var closedType=OpenType.MakeGenericType(instance.Property.PropertyType);
instance.CustomType(closedType);
}
public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria){
criteria.Expect(
x=>typeof(Enumeration).IsAssignableFrom(x.Property.PropertyType) ||
typeof(IEnumerable<Enumeration>)
.IsAssignableFrom(x.Property.PropertyType));
}
}
答案 0 :(得分:3)
您可以使用Type.IsAssignableFrom(Type)
。但是,您的问题并不是很清楚 - 您指定了一个类型,但是您需要两个...... Bar
哪个类型要检查t
?
请注意,由于通用的协方差,.NET 3.5和.NET 4之间的答案会发生变化 - 例如,List<Foo>
不可分配给{{ 1}},但在.NET 4中它是。
编辑:这是一个打印True,True,False,False的程序。我不确定你为什么期望第二个是假的:
IEnumerable<Base>