2010-02-19 26 views
18

tôi muốn làm một cái gì đó như thế nàySử dụng 'hành is` với Generics trong C#

class SomeClass<T> 
{ 
    SomeClass() 
    { 
     bool IsInterface = T is ISomeInterface; 
    } 
} 

cách tốt nhất để một cái gì đó như thế này là gì?

Lưu ý: Tôi không tìm cách hạn chế T với số where, nhưng tôi muốn mã của mình biết các loại giao diện T thực hiện. Tôi thích rằng tôi không phải xây dựng một số T.

+11

Nếu bạn đang kiểm tra các loại trong một phương pháp/lớp generic, IMO cái gì là sai. – spender

+0

Tôi không muốn có 3 con cháu riêng biệt của SomeClass. Tôi muốn một số lớp học cho những thứ nhất định tùy thuộc vào nếu 'T' có một cái gì đó. –

Trả lời

25

Tôi không nghĩ bạn có thể sử dụng toán tử is cho điều này. Nhưng bạn có thể sử dụng IsAssignableFrom:

bool IsInterface = typeof(ISomeInterface).IsAssignableFrom(typeof(T)); 
1

Tôi tin rằng tốt nhất bạn có thể làm điều đó:

bool IsInterface = typeof(ISomeInterface).IsAssignableFrom(typeof(T)); 
7

nên sử dụng sau đây thay vì

bool IsInterface = typeof(ISomeInterface).IsAssignableFrom(typeof(T)); 

là nhà điều hành

Toán tửđược sử dụng để kiểm tra xem run-time type của một đối tượng là compatible với một số type nhất định.

Một biểu hiện nơi việc sử dụng is phù hợp với các cú pháp, để đánh giá đúng, nếu cả hai điều kiện sau đây được đáp ứng:

  • biểu hiện không phải là null.
  • biểu thức có thể được truyền để nhập. Điều đó là, biểu thức truyền của biểu mẫu (loại) (biểu thức) sẽ hoàn thành mà không cần ném ngoại lệ. Để biết thêm thông tin, xem 7.6.6 Cast expressions.

Tài liệu tham khảo

0

Bạn có thể thử làm một cái gì đó giống như

Type Ttype = typeof(T); 

Điều đó sẽ cung cấp cho bạn toàn bộ sức mạnh của lớp Loại, có chức năng như "FindInterfaces".

2

Bạn có thể sử dụng IsAssignableFrom:

class SomeClass<T> 
    { 
    SomeClass() 
    { 
     bool IsIComparable = typeof(IComparable).IsAssignableFrom(typeof(T)); 
    } 
    } 
2
bool IsInterface = typeof(ISomeInterface).IsAssignableFrom(typeof(T))