2013-12-18 6 views
6

.Net typeof(DateTime?).Name में प्रतिबिंब का उपयोग करके "Nullable`1" लौटाता है।टाइपऑफ (डेटटाइम?)। नाम == निरर्थक`1

क्या स्ट्रिंग के रूप में वास्तविक प्रकार को वापस करने का कोई तरीका है। (इस मामले में "डेटटाइम" या "सिस्टम। डेटटाइम")

मुझे लगता है कि DateTime?Nullable<DateTime> है। यह बिंदु के अलावा, मैं सिर्फ शून्य प्रकार के प्रकार की तलाश में हूं।

+4

वास्तविक प्रकार 'Nullable ' – StuartLC

+0

प्रश्न बाहर ले निशान है। –

+1

एक परीक्षण के रूप में ध्यान में रखें यह ठीक है, कोड में प्रश्न चिह्न को हटाने से शायद कुछ तोड़ जाएगा। – James

उत्तर

10

एक Nullable.GetUnderlyingType विधि है जो आप इस मामले में मदद कर सकते हैं नहीं है।

public static string GetTypeName(Type type) 
{ 
    var nullableType = Nullable.GetUnderlyingType(type); 

    bool isNullableType = nullableType != null; 

    if (isNullableType) 
     return nullableType.Name; 
    else 
     return type.Name; 
} 

उपयोग::

Console.WriteLine(GetTypeName(typeof(DateTime?))); //outputs "DateTime" 
Console.WriteLine(GetTypeName(typeof(DateTime))); //outputs "DateTime" 

संभव है कि आप अपनी खुद की उपयोगिता विधि बनाने के लिए, क्योंकि (मैं यह सोचते हैं रहा हूँ) तुम दोनों नल और गैर-व्यर्थ प्रकार का उपयोग हो जाएगा चाहते पहुंच जाएंगे

संपादित करें: मुझे लगता है तुम भी प्रकार पर अन्य तंत्र, जिस स्थिति में आप थोड़ा इस संशोधित कर सकते हैं का उपयोग कर किया जा सकता है अंतर्निहित प्रकार मिलता है या मौजूदा प्रकार का उपयोग करने अगर यह गैर-व्यर्थ है:

public static Type GetNullableUnderlyingTypeOrTypeIfNonNullable(this Type possiblyNullableType) 
{ 
    var nullableType = Nullable.GetUnderlyingType(possiblyNullableType); 

    bool isNullableType = nullableType != null; 

    if (isNullableType) 
     return nullableType; 
    else 
     return possiblyNullableType; 
} 

और वह एक भयानक एक विधि के लिए नाम है, लेकिन मैं काफी चालाक एक साथ आने के लिए नहीं कर रहा हूँ (मैं अगर किसी को एक अच्छा वाला पता चलता है इसे बदलने के लिए खुशी होगी!)

तब के रूप में

एक विस्तार विधि, अपने उपयोग की तरह हो सकता है:

public static string GetTypeName(this Type type) 
{ 
    return type.GetNullableUnderlyingTypeOrTypeIfNonNullable().Name; 
} 

या

typeof(DateTime?).GetNullableUnderlyingTypeOrTypeIfNonNullable().Name 
+2

'सार्वजनिक स्थैतिक स्ट्रिंग GetTypeName (इस प्रकार का प्रकार)'! –

5

के रूप में पेट्रिक द्वारा ने कहा:

typeof(DateTime?).GetGenericArguments()[0].Name

+1

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

+0

@ChrisSinclair कोई यह देखने के लिए बस एक चेक जोड़ सकता है कि यह प्रकार स्वयं को 'नलबल' है और अपवाद फेंक दे, अगर यह आपको आवश्यक व्यवहार है। – Servy

+0

@ सर्वी: ओह निश्चित रूप से। मैं सिर्फ चाड को इस चेतावनी में से एक को इंगित करना चाहता था क्योंकि हमें जरूरी नहीं कि वह अपने इच्छित उपयोग के पूर्ण दायरे को जान सके; उसे बाद में सड़क पर आश्चर्यचकित नहीं करना चाहता था। विस्तार विधि के लिए –

2

क्रिस सिंक्लेयर कोड काम करता है लेकिन मैं इसे अधिक संक्षिप्त दुबारा लिखा।

public static Type GetNullableUnderlyingTypeIfNullable(Type possiblyNullableType) 
    { 
     return Nullable.GetUnderlyingType(possiblyNullableType) ?? possiblyNullableType; 
    } 

और फिर इसका इस्तेमाल:

GetNullableUnderlyingTypeIfNullable(typeof(DateTime?)).Name 
संबंधित मुद्दे