जाँच कर रहा है कि टाइप उदाहरण C # में एक अशक्त एनम है


84

मैं कैसे जांचूं कि क्या कोई C # में एक अशक्त एनम है

Type t = GetMyType();
bool isEnum = t.IsEnum; //Type member
bool isNullableEnum = t.IsNullableEnum(); How to implement this extension method?

जवाबों:


170
public static bool IsNullableEnum(this Type t)
{
    Type u = Nullable.GetUnderlyingType(t);
    return (u != null) && u.IsEnum;
}

44

संपादित करें: मैं इस उत्तर को छोड़ने जा रहा हूं क्योंकि यह काम करेगा, और यह कुछ कॉलों को प्रदर्शित करता है जिनके बारे में पाठकों को अन्यथा पता नहीं चल सकता है। हालांकि, ल्यूक का जवाब निश्चित रूप से अच्छा है - इसे बढ़ाएं :)

तुम कर सकते हो:

public static bool IsNullableEnum(this Type t)
{
    return t.IsGenericType &&
           t.GetGenericTypeDefinition() == typeof(Nullable<>) &&
           t.GetGenericArguments()[0].IsEnum;
}

मुझे लगता है कि मैंने इसे ल्यूक की तरह से किया होगा; कॉलर के लिए कम जटिल।
मार्क Gravell

2
@Marc: मैं यह नहीं देखता कि यह कॉल करने वाले के लिए कोई भी मुश्किल कैसे खड़ी करता है - लेकिन ल्यूक का रास्ता निश्चित रूप से मेरा है।
जॉन स्कीट

हाँ भविष्य के संदर्भ के लिए इसे जरूर रखें
एड्रिन

हाँ। मैंने "सार्वजनिक स्थैतिक मल IsNullableEnum (ऑब्जेक्ट वैल्यू) {अगर (मान == null {{सत्य सही;} टाइप करें t = value.GetType) (); वापसी / * वही जो जॉन की वापसी * ​​/?}" क्योंकि यह हो सकता है; बॉक्सिंग प्रकारों के साथ काम करें। और फिर बेहतर प्रदर्शन के लिए ल्यूक जवाब के साथ अतिभारित।
तमसुजॉयस

16

C # 6.0 के रूप में स्वीकार किए जाते हैं जवाब के रूप में refactored जा सकता है

Nullable.GetUnderlyingType(t)?.IsEnum == true

== सच को बूल बदलने की जरूरत है? to bool


1
public static bool IsNullable(this Type type)
{
    return type.IsClass
        || (type.IsGeneric && type.GetGenericTypeDefinition == typeof(Nullable<>));
}

मैंने IsEnumआपके द्वारा पहले से किए गए चेक को छोड़ दिया, क्योंकि यह इस विधि को अधिक सामान्य बनाता है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.