2011-09-28 16 views
38

मेरे पास एक सामान्य विधि व्यवहार है जिसमें टी पर निर्भर करता है संदर्भ प्रकार या मान प्रकार। यह इतना दिखता है:यह निर्धारित करने के लिए कि टी सामान्य में एक मान प्रकार या संदर्भ वर्ग है या नहीं?

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 SomeGenericMethod <T> (T obj) where T : class 
{ 
//Do one stuff 
} 

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

क्योंकि उनके हस्ताक्षर बराबर हैं। क्या कोई मेरी मदद कर सकता है?

उत्तर

62

आप सामान्य प्रकार के साथ typeof operator उपयोग कर सकते हैं, तो typeof(T), Type संदर्भ T करने के लिए इसी मिल जाएगा और उसके बाद का उपयोग IsValueType संपत्ति:

if (typeof(T).IsValueType) 

या आप नल मूल्य प्रकार में शामिल करना चाहते हैं जैसे कि वे हम रे संदर्भ प्रकार:

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

शून्य मूल्य प्रकारों पर आपके अतिरिक्त स्पष्टीकरण के लिए धन्यवाद। – mkus

+0

दूसरा विकल्प शून्य प्रकार के साथ एक मूल्य प्रकार की एक संभावित तुलना है, जो कुछ रेसर्पर के बारे में छाल पसंद करता है। क्या उसके आस-पास कोई रास्ता है? – bubbleking

+0

@ बबलिंग: यह इस बात पर निर्भर करता है कि आप क्या हासिल करने की कोशिश कर रहे हैं, वास्तव में ... –

6

Type.IsValueType बताता है, स्वाभाविक रूप से, यदि Type एक मान प्रकार है। इसलिए, typeof(T).IsValueType

6

[निम्नलिखित जवाब T की स्थिर प्रकार लेकिन obj की गतिशील प्रकार की जांच नहीं करता है। यह आप के लिए क्या कहा, लेकिन क्योंकि यह वैसे भी आपकी समस्या के लिए उपयोगी हो सकता है, मैं संदर्भ के लिए इस सवाल का जवाब रखेंगे नहीं बिल्कुल है।]

सभी मूल्य प्रकार (और केवल उन) System.ValueType से निकाले जाते हैं। इस प्रकार, निम्न स्थिति इस्तेमाल किया जा सकता:

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

टी एक प्रकार है, अभिव्यक्ति नहीं, इसलिए आप 'is' का उपयोग नहीं कर सकते हैं। साथ ही, विचार करें कि 'टी' बिल्कुल सिस्टम है। वैल्यू टाइप, जो एक संदर्भ प्रकार है ... –

+0

@ जोनस्केट: धन्यवाद, अच्छा बिंदु, 'ओबीजे वैल्यू टाइप' में बदल गया है। चूंकि 'वैल्यू टाइप' एक अमूर्त वर्ग है, 'ओबीजे' बिल्कुल 'वैल्यू टाइप' नहीं हो सकता है (बेशक, यह मानता है कि 'ओबीजे' शून्य नहीं है ... मैं इसे अपने उत्तर में जोड़ दूंगा)। – Heinzi

+0

जो आपको 'टी' के बारे में नहीं बताता है। 'SomeGenericMethod (शून्य)' - 'int? 'मान मान एक मान प्रकार है, लेकिन आपकी स्थिति मेल नहीं खाती है। –

4

इस प्रयास करें:

if (typeof(T).IsValueType) 
संबंधित मुद्दे

 संबंधित मुद्दे