Как содержать тип в наборе посредством отражения

Википедия имеет это для высказывания о различиях.

В общем JScript язык сценариев ActiveX, который, вероятно, интерпретируется как JavaScript браузерами неIE.

11
задан Stefano Ricciardi 14 December 2009 в 11:37
поделиться

5 ответов

Из Блог Мэтта Уоррена :

internal static class TypeSystem {
    internal static Type GetElementType(Type seqType) {
        Type ienum = FindIEnumerable(seqType);
        if (ienum == null) return seqType;
        return ienum.GetGenericArguments()[0];
    }
    private static Type FindIEnumerable(Type seqType) {
        if (seqType == null || seqType == typeof(string))
            return null;
        if (seqType.IsArray)
            return typeof(IEnumerable<>).MakeGenericType(seqType.GetElementType());
        if (seqType.IsGenericType) {
            foreach (Type arg in seqType.GetGenericArguments()) {
                Type ienum = typeof(IEnumerable<>).MakeGenericType(arg);
                if (ienum.IsAssignableFrom(seqType)) {
                    return ienum;
                }
            }
        }
        Type[] ifaces = seqType.GetInterfaces();
        if (ifaces != null && ifaces.Length > 0) {
            foreach (Type iface in ifaces) {
                Type ienum = FindIEnumerable(iface);
                if (ienum != null) return ienum;
            }
        }
        if (seqType.BaseType != null && seqType.BaseType != typeof(object)) {
            return FindIEnumerable(seqType.BaseType);
        }
        return null;
    }
}
19
ответ дан 3 December 2019 в 04:13
поделиться
Type t = null
foreach(object o in list)
{
o.GetType();
}

даст вам тип объекта.

Тогда вам, вероятно, следует проверить желаемые типы:

if(t == typeof(myClass))
{
dosomething();
}
else if (t == typeof(myOtherClass))
{
dosomethingelse();
}
0
ответ дан 3 December 2019 в 04:13
поделиться
myCollection.GetType().GetGenericArguments() 

вернет массив типа args.

9
ответ дан 3 December 2019 в 04:13
поделиться

Вы не можете просто использовать t.GetType () для этого.

-1
ответ дан 3 December 2019 в 04:13
поделиться

Почему бы вместо этого просто не реализовать IEnumerable ? Например:

public void MyFunc (объекты IEnumerable )

Кроме этого, вам лучше проверить тип каждого отдельного объекта, используя is или .GetType вместо того, чтобы пытаться решить это из самого контейнера.

Если это не вариант, и вам действительно нужно знать тип базового контейнера, который вам в основном придется проверить с помощью , это , чтобы узнать, какие интерфейсы он реализует (например, IList и т. Д.). Скорее всего, тип вашего массива будет универсальным, что означает, что попытка вернуться к его названию и типу данных будет довольно беспорядочной.

-1
ответ дан 3 December 2019 в 04:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: