2010-09-26 50 views
1

应该很容易......如何检查类型是IEnumerable <BaseType>?

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

只是回答问题:为什么:第二个应该是假的(实际上 - 它并不重要,引起酒吧争论永远不会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

你真的不能想出比'Bar'更好的名字吗? – Timwi 2010-09-26 15:04:57

+0

@Timwi巴兹呢? – 2010-09-26 15:08:31

+0

@Arnis:你见过几个有这样的函数名的代码段?你能否诚实地想到一个描述函数*的名字? – Timwi 2010-09-26 15:11:33

回答

3

您可以使用Type.IsAssignableFrom(Type)。但是,您的问题并不十分清楚 - 您正在指定一个类型,但您需要两个......哪一类型为Bar意味着要检查t

注意,答案将.NET 3.5和.NET 4之间,由于通用的协方差改变 - 在.NET 3.5,例如List<Foo>分配给IEnumerable<Base>,但在.NET 4中它是。

编辑:这是一个打印真,假,假,错误的程序。我不知道为什么你期望第二个是错误的:

using System; 
using System.Collections; 
using System.Collections.Generic; 

class Base{}  
class Foo:Base{} 

class Test 
{ 
    static bool Bar(Type t) 
    { 
     return typeof(IEnumerable<Base>).IsAssignableFrom(t); 
    } 

    static void Main() 
    { 
     Console.WriteLine(Bar(typeof(IEnumerable<Foo>))); 
     Console.WriteLine(Bar(typeof(IEnumerable<Base>))); 
     Console.WriteLine(Bar(typeof(string))); 
     Console.WriteLine(Bar(typeof(Foo))); 
    } 
} 
+0

如果参数是'typeof(Foo)',这将起作用。但据我所知 - 它不会,如果参数是'typeof(IEnumerable )'。 – 2010-09-26 12:43:36

+0

@Arnis:看我的编辑 - 你使用.NET 3.5或.NET 4吗?另外请注意我的编辑问题,我问你正在检查哪两种*类型。您尚未指定应根据“IEnumerable '检查哪种类型。 – 2010-09-26 12:45:15

+0

在这里使用c#4。标记的问题。 – 2010-09-26 12:45:41

相关问题