これはうまくいきます:
_var expectedType = typeof(string);
object value = "...";
if (value.GetType().IsAssignableFrom(expectedType))
{
...
}
_
しかし、expectedType
をtypeof(string[])
に設定せずに、値が文字列配列であるかどうかを確認するにはどうすればよいですか?私は次のようなことをしたい:
_var expectedType = typeof(string);
object value = new[] {"...", "---"};
if (value.GetType().IsArrayOf(expectedType)) // <---
{
...
}
_
これは可能ですか?
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))
_
拡張メソッドを使用できます(必須ではありませんが、読みやすい):
public static class TypeExtensions
{
public static bool IsArrayOf<T>(this Type type)
{
return type == typeof (T[]);
}
}
次に使用します:
Console.WriteLine(new string[0].GetType().IsArrayOf<string>());
見つかった最も安全で安全な方法は、MakeArrayType
を使用することです。
var expectedType = typeof(string);
object value = new[] {"...", "---"};
if (value.GetType() == expectedType.MakeArrayType())
{
...
}
value.GetType().GetElementType() == typeof(string)
追加ボーナスとして(ただし、100%確信はありません。これは私が使用するコードです...)
var ienum = value.GetType().GetInterface("IEnumerable`1");
if (ienum != null) {
var baseTypeForIEnum = ienum.GetGenericArguments()[0]
}
これを使用して、List、IEnumerable ...を検索し、Tを取得できます。