2009-07-29 9 views
5

実行時にオブジェクトの型を派生しようとしています。具体的には、ICollectionかIDtoかの2つのことを知る必要があります。私はこれよりも良い方法がなければならない確信していますがジェネリックの使用時にタイプを比較するにはどうすればよいですか?

private static bool IsACollection(PropertyDescriptor descriptor) 
    { 
     bool isCollection = false; 

     foreach (Type type in descriptor.PropertyType.GetInterfaces()) 
     { 
      if (type.IsGenericType) 
      { 
       if (type.GetGenericTypeDefinition() == typeof(ICollection<>)) 
       { 
        isCollection = true; 
        break; 
       } 
      } 
      else 
      { 
       if (type == typeof(ICollection)) 
       { 
        isCollection = true; 
        break; 
       } 
      } 
     } 


     return isCollection; 
    } 

    private static bool IsADto(PropertyDescriptor descriptor) 
    { 
     bool isDto = false; 

     foreach (Type type in descriptor.PropertyType.GetInterfaces()) 
     { 
      if (type == typeof(IDto)) 
      { 
       isDto = true; 
       break; 
      } 
     }   
     return isDto; 
    } 

:現在、私は見つけることができた私の唯一の解決策はこれです。しかし、これはまだリフレクションを使用するときにリフレクションを使用しない場合、それは正常に動作失敗

if(descriptor.PropertyType == typeof(ICollection<>)) 

:私のような通常の方法で比較しようとしています。

私のエンティティのすべてのフィールドのインターフェイスを反復したくありません。誰かがこれを行う別の方法についていくつかの光を当てることができましたか?はい、私は時期尚早に最適化していますが、あまりにも醜いので、私をユーモアしてください。

警告は:

  1. これは、または>などのIList <として、一般的なこと>またはちょうど私がいるICollectionまたはICollectionを<を探していますので、なぜArrayListのことができませんでしたでした。ですから、私はICollectionを使用してテストするかどうかを知るために、if文でIsGenericTypeを使用する必要があると仮定します。<>事前に

ありがとう!

答えて

11

このされている必要があります:プロパティのタイプは正確ICollectionある場合

type == typeof(ICollection) 

をチェックします。あなたは、プロパティのタイプは、あるかから派生しているかどうかを確認したい場合は、

public List<int> x { get; set; } 

ICollection、最も単純:

ため
public ICollection<int> x { get; set; } 

ではなく:つまり、それがためにtrueを返します方法はType.IsAssignableFromを使用することです:

typeof(ICollection).IsAssignableFrom(type) 

と同じことが一般的なのために行く:

typeof(ICollection<>).IsAssignableFrom(type.GetGenericTypeDefinition()) 
+0

実際に彼は階層全体を通過しています。さらに、ICollection <>はICollectionを直接実装しません。 – Guvante

+0

これはそうしました、私はこれらのコマンドの順序を逆転させました!私はtypeof(IList <>)を行っていました。IsAssignableFrom(typeof(ICollection <>))ありがとうございました! – joshlrogers

+0

これは私のためには機能しませんでした。[別の質問](http://stackoverflow.com/q/18937119/122781)。 – HappyNomad

2

type.IsAssignableはこの場合に役に立ちますか?

編集:申し訳ありませんが、それはType.IsAssignableFrom

+0

残念ながら、私がproperty.PropertyType.IsAssignableFrom(ICollection <>)をチェックし、その型がIList <>である場合、それはまだ失敗します。ありがとう、結構です。 – joshlrogers

関連する問題