2010-09-26 48 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

相關問題