Проверьте, является ли typeof (объект) в Списке ссылочным типом - PullRequest
2 голосов
/ 09 октября 2010

мне это кажется странным:

if(customerList.Count > 0)
{
   if(typeof(customerList[0]).IsReferenceType)
   {
      // do what I want
   }
}

Как бы вы это сделали?

Ответы [ 4 ]

9 голосов
/ 09 октября 2010
  1. Чтобы определить, является ли первый элемент в списке объектом ссылочного типа:

    bool isReferenceType = !(customerList[0] is ValueType);
    
  2. Чтобы определить, является ли список List<T> для некоторого T, который является ссылочным типом:

    var listType = customerList.GetType();
    if (!listType.IsGeneric || listType.GetGenericTypeDefinition() != typeof(List<>))
        // It’s not a List<T>
        return null;
    return !listType.GetGenericArguments()[0].IsValueType;
    
1 голос
/ 09 октября 2010

Возможно, вы пытаетесь определить фактический тип универсального параметра универсальной коллекции.Как определение во время выполнения, что представляет собой T определенного List<T>.Сделайте это:

Type collectionType = typeof(customerList);
Type parameterType = collectionType.GetGenericArguments()[0];
bool isReference = !parameterType.IsValueType;
0 голосов
/ 09 октября 2010

хорошо, это сработало, и я не получаю исключения, когда customerList пуст.

Type collectionType = customerList.GetType();
   Type parameterType = collectionType.GetGenericArguments()[0];
   bool isReference = !parameterType.IsValueType;

@ Adesit вы получаете очко, потому что ваш образец был правильным, кроме первой строки: P

0 голосов
/ 09 октября 2010
bool isReferenceType = !(customerList[0] is ValueType);

РЕДАКТИРОВАТЬ

Или вы ищете что-то вроде:

bool listIsOfReferenceTypeObjects = !myList.GetType().GetGenericArguments()[0].IsValueType;
...