ジェネリックを使用するときに型を比較するにはどうすればよいですか?
-
05-07-2019 - |
質問
実行時にオブジェクトのタイプを導出しようとしています。具体的には、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<>))
ただし、これはリフレクションを使用すると失敗しますが、リフレクションを使用しないと正常に機能します。
エンティティのすべてのフィールドのインターフェースを反復処理したくありません。誰かがこれを行う別の方法に光を当てることができますか?はい、私は時期尚早に最適化していますが、あまりにもいので、ユーモアをお願いします。
警告:
- 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
所属していません StackOverflow