2015-10-28 4 views
5

IEnumerable変数をタイプ別に分けたいと思います。私のコードは次のようにされていますEnumerableのタイプのみを取得する方法は?

if (type is IEnumerable) 
{ 
    var listGenericType = type.GetType().GetGenericTypeDefinition().Name; 
    listGenericType = listGenericType.Substring(0, listGenericType.IndexOf('`')); 
    if (listGenericType == "List") { 
     //do something 
    } 

    else if (listGenericType == "HashSet") { 
     //do something 
    } 
} 

私はtype.GetType().GetGenericTypeDefinition().Nameを使用し、listGenericTypeList`1またはHashSet`1のようですが、私はListまたはHashSetのようにそれをしたいです。したがって、私はこの問題を処理するためにSubstringを使用しました!

postprocessing stringタイプなしでこの問題を処理する方法はありますか?私は以下のようなコードを意味します:

if (type is IEnumerable) 
{ 
    var listGenericType = type.GetType().GetGenericTypeDefinitionWithoutAnyNeedForPostProcessing(); 
    if (listGenericType == "List") { 
     //do something 
    } 

    else if (listGenericType == "HashSet") { 
     //do something 
    } 
} 
+1

https://msdn.microsoft.com/en-us/library/system.type.getgenerictypedefinition.aspx –

答えて

5

あなたはそれを文字列と比較する必要はありません。あなたのタイプでない場合は、一般的なタイプならば@nopeflowは親切に、以下で指摘したように

if (type is IEnumerable) 
{ 
    var listGenericType = type.GetType().GetGenericTypeDefinition(); 

    if (listGenericType == typeof(List<>)) { 
     //do something 
    } 
    else if (listGenericType == typeof(HashShet<>)) { 
     //do something 
    } 
} 

GetGenericTypeDefinition()タイプを返すので、あなたがしなければならないすべては、次のようなtypeof演算子を使用して、タイプに対してそれを比較していますGetGenericTypeDefinition()InvalidOperationExceptionを投げます。それを考慮してください。

+3

これは、いくつかのタイプが 'IEnumerable'を実装することができることを言及するために怒っだが、そのタイプは一般的なものではありません。 (型は 'IEnumerable'を実装するかもしれませんが、' IEnumerable 'は....' GetGenericTypeDefinition'は 'InvalidOperationException'を投げます。) – pwas

+0

ありがとう、私の答えを編集しました – kskyriacou

0

あなたが一般的なタイプのみを探しているとすれば、これはあなたを助けるかもしれないと信じています。

  List<int> someObject = new List<int>(); 
      Type currentType = someObject.GetType(); 

      if (currentType.IsGenericType) 
      { 
       if (currentType.GetGenericTypeDefinition() == typeof(List<>)) 
       { 
        // Do something 
       } 
       else if (currentType.GetGenericTypeDefinition() == typeof(HashSet<>)) 
       { 
        // Do something else 
       } 
      } 
関連する問題