2009-03-12 18 views
9

オブジェクトがnull、値型、またはであるかどうかを確認する必要があります。Tは値型です。これまでのところ私が持っている:オブジェクトの型がIEnumerable <T>のサブクラスであるかどうかを、どのような値型Tで調べるにはどうすればよいですか?

if ((obj == null) || 
    (obj .GetType().IsValueType)) 
{ 
    valid = true; 
} 
else if (obj.GetType().IsSubclassOf(typeof(IEnumerable<>))) 
{ 
    // TODO: check whether the generic parameter is a value type. 
} 

のでオブジェクトは、値型、またはいくつかのTためIEnumerable<T> NULLであることを、私を見つけました。そのTが値型であるかどうかを確認するにはどうすればよいですか?

答えて

12

(編集 - 付加価値タイプビット)あなたはそれを実装して、すべてのインターフェイスをチェックする必要があり

(それは理論的にはT複数のためのIEnumerable<T>を実装することができます)。

foreach (Type interfaceType in obj.GetType().GetInterfaces()) 
{ 
    if (interfaceType.IsGenericType 
     && interfaceType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) 
    { 
     Type itemType = interfaceType.GetGenericArguments()[0]; 
     if(!itemType.IsValueType) continue; 
     Console.WriteLine("IEnumerable-of-" + itemType.FullName); 
    } 
} 
+1

は、あなたが親を上がっていくことを心配する必要はありません意味するのに十分な再帰GetInterfacesメソッドですタイプ? –

+0

@ジョン:そうだと思います。 –

+1

再帰は必要ありません。クラスはインタフェースを実装するか、インタフェースを実装しません。インターフェイス自体が互いにどのように継承しているかにかかわらず、フラットなリストです。 – Tar

0

はあなたとのsomethinを行うことができますGetGenericArguments

0

指定された型(またはその基底クラス)が型Tのインタフェースを実装するかどうかを確認する私の一般的な貢献:

public static bool ImplementsInterface(this Type type, Type interfaceType) 
{ 
    while (type != null && type != typeof(object)) 
    { 
     if (type.GetInterfaces().Any(@interface => 
      @interface.IsGenericType 
      && @interface.GetGenericTypeDefinition() == interfaceType)) 
     { 
      return true; 
     } 

     type = type.BaseType; 
    } 

    return false; 
} 
関連する問題