2011-09-28 38 views
38

Tôi có một hành vi phương pháp chung mà phụ thuộc vào T là kiểu tham chiếu hoặc loại giá trị. Nó trông giống như vậy:Làm thế nào để xác định xem T là một loại giá trị hoặc lớp tham chiếu trong chung chung?

T SomeGenericMethod <T> (T obj) 
{ 
    if (T is class) //What condition I must write in the brackets? 
    //to do one stuff 
    else //if T is a value type like struct, int, enum and etc. 
    //to do another stuff 
} 

Tôi không thể lặp lại phương pháp này như sau:

T SomeGenericMethod <T> (T obj) where T : class 
{ 
//Do one stuff 
} 

T SomeGenericMethod <T> (T obj) where T : struct 
{ 
//Do another stuff 
} 

vì chữ ký của họ đều bình đẳng. Ai giúp tôi với?

Trả lời

62

Bạn có thể sử dụng typeof operator với các loại chung chung, do typeof(T) sẽ nhận được Type tham khảo tương ứng với T, và sau đó sử dụng IsValueType thuộc tính:

if (typeof(T).IsValueType) 

Hoặc nếu bạn muốn bao gồm các loại giá trị không có giá trị như thể chúng tôi các loại tham chiếu lại:

// Only true if T is a reference type or nullable value type 
if (default(T) == null) 
+1

Cảm ơn bạn đã giải thích thêm về các loại giá trị không thể thực hiện được. – mkus

+0

Tùy chọn thứ hai là một so sánh có thể có của một loại giá trị với null, đó là một cái gì đó ReSharper thích sủa. Có đường nào quanh đó không? – bubbleking

+0

@bubbleking: Nó phụ thuộc vào những gì bạn đang cố gắng đạt được, thực sự ... –

6

Type.IsValueType cho biết, một cách tự nhiên, nếu Type là một loại giá trị. Do đó, typeof(T).IsValueType.

6

[Câu trả lời sau đây không kiểm tra kiểu tĩnh của T nhưng loại động của obj. Đây không phải là chính xác là những gì bạn đã yêu cầu, nhưng vì nó có thể hữu ích cho vấn đề của bạn, tôi sẽ giữ câu trả lời này để tham khảo.]

Tất cả các loại giá trị (và chỉ có) lấy từ System.ValueType. Như vậy, điều kiện sau đây có thể được sử dụng:

if (obj is ValueType) { 
    ... 
} else { 
    ... 
} 
+0

T là loại, không phải là cụm từ, vì vậy bạn không thể sử dụng 'is'. Ngoài ra, hãy xem xét nơi 'T' chính xác là System.ValueType, là một kiểu tham chiếu ... –

+0

@JonSkeet: Cảm ơn, điểm tốt, thay đổi thành' obj là ValueType'. Vì 'ValueType' là một lớp trừu tượng,' obj' không thể chính xác 'ValueType' (tất nhiên, điều này giả định rằng' obj' không phải là null ... Tôi sẽ thêm nó vào câu trả lời của tôi). – Heinzi

+0

Điều đó không cho bạn biết về 'T'. Hãy xem xét 'SomeGenericMethod (null) '-' int? 'Là một loại giá trị, nhưng tình trạng của bạn sẽ không khớp. –

4

thử điều này:

if (typeof(T).IsValueType) 
Các vấn đề liên quan