ジェネリックを使用するときに型を比較す​​るにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1201753

質問

実行時にオブジェクトのタイプを導出しようとしています。具体的には、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 <!> lt; <!> gt;のように、ジェネリックにすることもできなかった。または単にArrayListなので、ICollectionまたはICollection <!> lt; <!> gt;を探しているのはなぜですか。 ICollection <!> lt; <!> gt;を使用してテストするかどうかを知るために、ifステートメントでIsGenericTypeを使用する必要があると思います。かどうか。

事前に感謝します!

役に立ちましたか?

解決

これ:

type == typeof(ICollection)

プロパティのタイプが exactly ICollectionかどうかを確認します。つまり、次の場合にtrueを返します。

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

ただし、対象外:

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

プロパティのタイプがまたは派生するであるかどうかを確認する場合、Type.IsAssignableFrom、最も簡単な方法は<=>:

を使用することです
typeof(ICollection).IsAssignableFrom(type)

そしてジェネリックについても同じことが言えます:

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

他のヒント

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

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

になっているはずです
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top