web-dev-qa-db-ja.com

オブジェクトが特定のタイプの配列であるかどうかを確認する方法は?

これはうまくいきます:

_var expectedType = typeof(string);
object value = "...";
if (value.GetType().IsAssignableFrom(expectedType))
{
     ...
}
_

しかし、expectedTypetypeof(string[])に設定せずに、値が文字列配列であるかどうかを確認するにはどうすればよいですか?私は次のようなことをしたい:

_var expectedType = typeof(string);
object value = new[] {"...", "---"};
if (value.GetType().IsArrayOf(expectedType)) // <---
{
     ...
}
_

これは可能ですか?

59
Allrameest

Type.IsArray および Type.GetElementType() を使用して、配列の要素タイプを確認します。

_Type valueType = value.GetType();
if (valueType.IsArray && expectedType.IsAssignableFrom(valueType.GetElementType())
{
 ...
}
_

Type.IsAssignableFrom() に注意してください。タイプが完全に一致するかどうかを確認する場合は、同等性(_typeA == typeB_)を確認する必要があります。特定の型がその型自体であるか、サブクラス(またはインターフェイス)であるかを確認する場合は、Type.IsAssignableFrom()を使用する必要があります。

_typeof(BaseClass).IsAssignableFrom(typeof(ExpectedSubclass))
_
102
Stefan

拡張メソッドを使用できます(必須ではありませんが、読みやすい):

public static class TypeExtensions
{
    public static bool IsArrayOf<T>(this Type type)
    {
         return type == typeof (T[]);
    }
} 

次に使用します:

Console.WriteLine(new string[0].GetType().IsArrayOf<string>());
15
Aliostad

見つかった最も安全で安全な方法は、MakeArrayTypeを使用することです。

var expectedType = typeof(string);
object value = new[] {"...", "---"};
if (value.GetType() == expectedType.MakeArrayType())
{
     ...
}
6
Natxo
value.GetType().GetElementType() == typeof(string)

追加ボーナスとして(ただし、100%確信はありません。これは私が使用するコードです...)

var ienum = value.GetType().GetInterface("IEnumerable`1");

if (ienum != null) {
    var baseTypeForIEnum = ienum.GetGenericArguments()[0]
}

これを使用して、List、IEnumerable ...を検索し、Tを取得できます。

5
xanatos