Как получить тип T от члена универсального класса или метода?

Ответ на получение форматирования

Что произойдет, если вы сделаете

for(var i in data){
    var record = data[i];
    var recordId = record.id;
    rows += '<tr id="' + recordId + '" class="' + record.status + '">';
    rows += '<td width="1%" align="center">' + recordId + '</td>';
    rows += '<td width="1%" align="center"><span class="status" rel="' + recordId + '"><strong>' + data[i].status + '</strong></span></td>';
    rows += '<td width="70%"><span class="name">' + record.name + '</span></td>';
    rows += '<td width="2%">';
    rows += '<input type="button" class="failOne" rev="' + recordId + '" value="F">';
    rows += '<input type="button" class="promoteOne" rev="' + recordId + '" value="P">';
    rows += '</td>';
    rows += '<td width="1%">' + record.origin + '</td>';
    rows += '</tr>';
}//end for
623
задан CodeCaster 20 January 2017 в 14:23
поделиться

6 ответов

Если я понимаю правильно, Ваш список имеет тот же параметр типа как сам контейнерный класс. Если это верно, затем:

Type typeParameterType = typeof(T);

, Если Вы находитесь в удачной ситуации наличия object как параметр типа, см. ответ Marc .

649
ответ дан Joshua Duxbury 21 January 2017 в 00:23
поделиться
  • 1
    Очень хороший. Спасибо за совместное использование! – pmk 12 February 2013 в 23:27

(примечание: я предполагаю, что все, что Вы знаете, object или IList или подобно, и что список мог быть любым типом во времени выполнения)

, Если Вы знаете, что это List<T>, затем:

Type type = abc.GetType().GetGenericArguments()[0];

Другая опция состоит в том, чтобы посмотреть на индексатор:

Type type = abc.GetType().GetProperty("Item").PropertyType;

Используя новый TypeInfo:

using System.Reflection;
// ...
var type = abc.GetType().GetTypeInfo().GenericTypeArguments[0];
503
ответ дан Tim Meyer 21 January 2017 в 00:23
поделиться

Попробуйте

list.GetType().GetGenericArguments()
30
ответ дан sth 21 January 2017 в 00:23
поделиться
  • 1
    Если Вы всегда будете запрашивать столбец с ведущим %, индекс никогда не будет использоваться. Ответ таким образом зависит от того, как Вы запрашиваете свои данные. – Lieven Keersmaekers 7 September 2009 в 08:43

Type:

type = list.AsEnumerable().SingleOrDefault().GetType();
-9
ответ дан 22 November 2019 в 21:49
поделиться

Примите во внимание следующее: Я использую его для экспорта 20 типизированных списков таким же образом:

private void Generate<T>()
{
    T item = (T)Activator.CreateInstance(typeof(T));

    ((T)item as DemomigrItemList).Initialize();

    Type type = ((T)item as DemomigrItemList).AsEnumerable().FirstOrDefault().GetType();
    if (type == null) return;
    if (type != typeof(account)) //account is listitem in List<account>
    {
        ((T)item as DemomigrItemList).CreateCSV(type);
    }
}
8
ответ дан 22 November 2019 в 21:49
поделиться

Метод GetGenericArgument () должен быть установлен для базового типа вашего экземпляра. (чей класс является универсальным классом myClass ). В противном случае он возвращает тип [0]

Пример:

Myclass<T> instance = new Myclass<T>();
Type[] listTypes = typeof(instance).BaseType.GetGenericArguments();
5
ответ дан 22 November 2019 в 21:49
поделиться
Другие вопросы по тегам:

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