Как проверить, является ли объект массивом определенного типа?
Это отлично работает:
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)) // <---
{
...
}
Возможно ли это?
Ответы
Ответ 1
Используйте 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))
Ответ 2
Вы можете использовать методы расширения (не то, что вам нужно, но сделать его более читаемым):
public static class TypeExtensions
{
public static bool IsArrayOf<T>(this Type type)
{
return type == typeof (T[]);
}
}
И затем используйте:
Console.WriteLine(new string[0].GetType().IsArrayOf<string>());
Ответ 3
Самый аккуратный и безопасный способ сделать это, используя MakeArrayType
:
var expectedType = typeof(string);
object value = new[] {"...", "---"};
if (value.GetType() == expectedType.MakeArrayType())
{
...
}
Ответ 4
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
Вам действительно нужно знать тип массива? Или вам нужны только элементы определенного типа?
Если последнее, вы можете просто фильтровать только те элементы, которые соответствуют тому, что вы хотите:
string[] strings = array.OfType<string>();