Как проверить, является ли объект массивом определенного типа? - PullRequest
59 голосов
/ 11 марта 2011

Это прекрасно работает:

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)) // <---
{
     ...
}

Возможно ли это?

Ответы [ 6 ]

101 голосов
/ 11 марта 2011

Используйте Type.IsArray и Type.GetElementType () для проверки типа элемента массива.

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

Остерегайтесь типа .IsAssignableFrom () .Если вы хотите проверить тип на точное совпадение, вам следует проверить на равенство (typeA == typeB).Если вы хотите проверить, является ли данный тип самим типом или подклассом (или интерфейсом), тогда вы должны использовать Type.IsAssignableFrom():

typeof(BaseClass).IsAssignableFrom(typeof(ExpectedSubclass))
15 голосов
/ 11 марта 2011

Вы можете использовать методы расширения (не то, что вам нужно, но делает его более читабельным ):

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

И затем использовать:

Console.WriteLine(new string[0].GetType().IsArrayOf<string>());
6 голосов
/ 19 декабря 2012

Самый удобный и безопасный способ сделать это - использовать MakeArrayType:

var expectedType = typeof(string);
object value = new[] {"...", "---"};
if (value.GetType() == expectedType.MakeArrayType())
{
     ...
}
4 голосов
/ 11 марта 2011
value.GetType().GetElementType() == typeof(string)

в качестве дополнительного бонуса (но я не уверен на 100%. Это код, который я использую ...)

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

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

с этим вы можете искать List, IEnumerable ... и получать T.

0 голосов
/ 19 апреля 2018
if(objVal.GetType().Name == "Object[]")

верно для массива

0 голосов
/ 11 марта 2011

Вам действительно нужно знать тип массива? Или вам нужны только элементы определенного типа?

Если последнее, вы можете просто отфильтровать только те элементы, которые соответствуют тому, что вы хотите:

string[] strings = array.OfType<string>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...