如何检查类型是否为IEnumerable <basetype>?</basetype>

时间:2010-09-26 12:34:02

标签: c# c#-4.0 types ienumerable

应该很容易......

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));
    }
  }

1 个答案:

答案 0 :(得分:3)

您可以使用Type.IsAssignableFrom(Type)。但是,您的问题并不是很清楚 - 您指定了一个类型,但是您需要两个...... Bar哪个类型要检查t

请注意,由于通用的协方差,.NET 3.5和.NET 4之间的答案会发生变化 - 例如,List<Foo> 可分配给{{ 1}},但在.NET 4中它是。

编辑:这是一个打印True,True,False,False的程序。我不确定你为什么期望第二个是假的:

IEnumerable<Base>