получение типа T от IEnumerable <T>

Я рекомендую использовать DateFormat, например SimpleDateFormat

try {
    String timeLong = "2013-02-27 06:06:30";
    String timeShort = "16:06 AM";
    SimpleDateFormat formatLong = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
    SimpleDateFormat formatShort = new SimpleDateFormat("hh:mm aa", Locale.US);
    Log.v("out", formatShort.format(formatLong.parse(timeLong)));
    Log.v("out", formatShort.format(formatShort.parse(timeShort)));
} catch (ParseException e) {
    e.printStackTrace();
}

Я устал сегодня и чувствую, что что-то упустил в этом коде, поэтому я могу изменить его позже, но работает и не вызывает (прямо) устаревший класс Date.

98
задан Usman Masood 26 May 2009 в 09:36
поделиться

5 ответов

IEnumerable<T> myEnumerable;
Type type = myEnumerable.GetType().GetGenericArguments()[0]; 

Таким образом,

IEnumerable<string> strings = new List<string>();
Console.WriteLine(strings.GetType().GetGenericArguments()[0]);

печатает System.String .

См. MSDN для Type.GetGenericArguments .

Изменить: Я считаю, что это решит проблемы в комментариях:

133
ответ дан 24 November 2019 в 05:12
поделиться

typeof ( IEnumerable ) . GetGenericArguments () [0] вернет первый универсальный аргумент - в данном случае typeof (Foo) .

0
ответ дан 24 November 2019 в 05:12
поделиться

Если вы знаете IEnumerable (через дженерики), тогда подойдет только typeof (T) . В противном случае (для объекта или неуниверсального IEnumerable ) проверьте реализованные интерфейсы:

        object obj = new string[] { "abc", "def" };
        Type type = null;
        foreach (Type iType in obj.GetType().GetInterfaces())
        {
            if (iType.IsGenericType && iType.GetGenericTypeDefinition()
                == typeof(IEnumerable<>))
            {
                type = iType.GetGenericArguments()[0];
                break;
            }
        }
        if (type != null) Console.WriteLine(type);
19
ответ дан 24 November 2019 в 05:12
поделиться

Просто используйте typeof (T)

РЕДАКТИРОВАТЬ: Или используйте .GetType (). GetGenericParameter () для созданного объекта, если у вас нет T.

2
ответ дан 24 November 2019 в 05:12
поделиться

Большое спасибо за обсуждение. Я использовал его как основу для решения ниже, которое хорошо работает во всех интересующих меня случаях (IEnumerable, производные классы и т. Д.). Подумал, что я должен поделиться здесь, если кому-то это тоже понадобится:

  Type GetItemType(object someCollection)
  {
    var type = someCollection.GetType();
    var ienum = type.GetInterface(typeof(IEnumerable<>).Name);
    return ienum != null
      ? ienum.GetGenericArguments()[0]
      : null;
  }
7
ответ дан 24 November 2019 в 05:12
поделиться
Другие вопросы по тегам:

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