2015-10-28 14 views
5

Tôi muốn tách riêng các biến số IEnumerable theo loại của chúng. Mã của tôi là như thế này:làm thế nào để chỉ nhận được loại Enumerable?

if (type is IEnumerable) 
{ 
    var listGenericType = type.GetType().GetGenericTypeDefinition().Name; 
    listGenericType = listGenericType.Substring(0, listGenericType.IndexOf('`')); 
    if (listGenericType == "List") { 
     //do something 
    } 

    else if (listGenericType == "HashSet") { 
     //do something 
    } 
} 

Khi tôi sử dụng type.GetType().GetGenericTypeDefinition().Name, các listGenericType là như List`1 hoặc HashSet`1 nhưng tôi muốn nó như List hoặc HashSet. Do đó, tôi đã sử dụng Substring để xử lý vấn đề này!

Có cách nào để xử lý vấn đề này mà không cần xử lý sau string không? Tôi có ý nghĩa giống như mã bên dưới:

if (type is IEnumerable) 
{ 
    var listGenericType = type.GetType().GetGenericTypeDefinitionWithoutAnyNeedForPostProcessing(); 
    if (listGenericType == "List") { 
     //do something 
    } 

    else if (listGenericType == "HashSet") { 
     //do something 
    } 
} 
+1

https://msdn.microsoft.com/en-us/library/system.type.getgenerictypedefinition.aspx –

Trả lời

5

Bạn không cần phải so sánh nó với chuỗi. Kể từ GetGenericTypeDefinition() lợi nhuận một loại , tất cả các bạn phải làm là so sánh nó với một loại sử dụng toán tử typeof, như vậy:

if (type is IEnumerable) 
{ 
    var listGenericType = type.GetType().GetGenericTypeDefinition(); 

    if (listGenericType == typeof(List<>)) { 
     //do something 
    } 
    else if (listGenericType == typeof(HashShet<>)) { 
     //do something 
    } 
} 

Như @nopeflow vui lòng chỉ ra dưới đây, nếu loại của mình nếu không muốn nói một kiểu generic sau đó GetGenericTypeDefinition() sẽ ném một số InvalidOperationException. Hãy chắc chắn rằng bạn tài khoản cho điều đó.

+3

Nó nổi giận kể rằng một số loại có thể thực hiện 'IEnumerable' nhưng loại đó không phải là chung một. (Kiểu có thể thực hiện 'IEnumerable' nhưng không phải' IEnumerable '.... Sau đó,' GetGenericTypeDefinition' sẽ ném 'InvalidOperationException'.) – pwas

+0

Cảm ơn bạn, đã chỉnh sửa câu trả lời của tôi – kskyriacou

0

Giả sử bạn đang tìm kiếm các loại Chung, tôi tin rằng điều này có thể giúp bạn.

  List<int> someObject = new List<int>(); 
      Type currentType = someObject.GetType(); 

      if (currentType.IsGenericType) 
      { 
       if (currentType.GetGenericTypeDefinition() == typeof(List<>)) 
       { 
        // Do something 
       } 
       else if (currentType.GetGenericTypeDefinition() == typeof(HashSet<>)) 
       { 
        // Do something else 
       } 
      } 
Các vấn đề liên quan