2008-10-30 49 views
11

Có cách nào để xác định xem đối tượng có phải là danh sách chung không? Tôi sẽ không biết loại danh sách, tôi chỉ biết đó là một danh sách. Làm thế nào tôi có thể xác định điều đó?Nếu đối tượng là Danh sách chung

Trả lời

22

này sẽ trở về "True"

List<int> myList = new List<int>(); 

Console.Write(myList.GetType().IsGenericType && myList is IEnumerable); 

Bạn có quan tâm để biết nếu nó chính xác là một "List" ... hay là bạn ok với nó là IEnumerable, và chung?

+0

Điều này hiện không biên dịch. https://dotnetfiddle.net/T0Q8w3. Có lẽ nó đã làm trong '08. – sonicblis

+1

Hey @sonicblis, "IEnumerable" nằm trong không gian tên "System.Collections". Bạn không có một 'bằng cách sử dụng System.Collections;' trong fiddle của bạn. Vẫn biên soạn vào năm 2016 :) –

+0

@Timothy_Khouri, ah, hiểu rồi. Cảm ơn con trỏ. – sonicblis

-1

Có một hàm GetType() trong lớp System.Object. Bạn đã thử chưa

+0

tổ chức sự kiện dù có lẽ đây không phải là một "hoàn hảo" câu trả lời, tôi không thể hiểu tại sao nó được gắn cờ trừ một.Thôi nào, đó không phải là câu trả lời tốt nhất có thể nhưng cố gắng không làm hỏng danh tiếng của ai đó. –

+0

GetType sẽ trả về danh sách chung chung cụ thể mà nó là, trái ngược với thực tế rằng nó chỉ là một danh sách chung chung. – Dested

2

Hãy thử:

if(yourList.GetType().IsGenericType) 
{ 
    var genericTypeParams = yourList.GetType().GetGenericArguments; 
    //do something interesting with the types.. 
} 
7

Phương pháp sau sẽ trả về loại mục của loại bộ sưu tập chung. Nếu loại không thực hiện ICollection <> sau đó null được trả về.

static Type GetGenericCollectionItemType(Type type) 
{ 
    if (type.IsGenericType) 
    { 
     var args = type.GetGenericArguments(); 
     if (args.Length == 1 && 
      typeof(ICollection<>).MakeGenericType(args).IsAssignableFrom(type)) 
     { 
      return args[0]; 
     } 
    } 
    return null; 
} 

Edit: Các giải pháp trên giả định rằng các loại quy định có một tham số chung của riêng nó. Điều này sẽ không làm việc với nhiều loại mà thực hiện ICollection <> với một tham số generic cứng mã hóa, ví dụ:

class PersonCollection : List<Person> {} 

Đây là một thực hiện mới mà sẽ xử lý trường hợp này.

static Type GetGenericCollectionItemType(Type type) 
{ 
    return type.GetInterfaces() 
     .Where(face => face.IsGenericType && 
         face.GetGenericTypeDefinition() == typeof(ICollection<>)) 
     .Select(face => face.GetGenericArguments()[0]) 
     .FirstOrDefault(); 
} 
0

Câu hỏi không rõ ràng.

Câu trả lời tùy thuộc vào ý bạn trong danh sách chung.

  • Một Danh sách <SomeType>?

  • Lớp học có nguồn gốc từ Danh sách <SomeType>?

  • Một lớp mà thực hiện IList <SomeType> (trong trường hợp một mảng có thể được coi là một danh sách chung - ví dụ int [] thực hiện IList <int>)?

  • Lớp học chung chung và triển khai IEnumerable (đây là bài kiểm tra được đề xuất trong accepted answer)? Nhưng điều này cũng sẽ xem xét các lớp bệnh lý thay vì sau đây là danh sách chung:

.

public class MyClass<T> : IEnumerable 
{ 
    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return null; 
    } 
} 

Giải pháp tốt nhất (ví dụ: sử dụng GetType, IsAssignableFrom, v.v.) sẽ tùy thuộc vào ý bạn.

1

Câu trả lời được chấp nhận không đảm bảo loại IList <>. Kiểm tra phiên bản này, nó làm việc cho tôi:

private static bool IsList(object value) 
{ 
    var type = value.GetType(); 
    var targetType = typeof (IList<>); 
    return type.GetInterfaces().Any(i => i.IsGenericType 
             && i.GetGenericTypeDefinition() == targetType); 
} 
Các vấn đề liên quan