यदि कोई दिया गया मूल्य सामान्य सूची है तो मैं कैसे जांच करूं?


90
public bool IsList(object value)
    {
        Type type = value.GetType();
        // Check if type is a generic list of any type
    }

यह जांचने का सबसे अच्छा तरीका है कि दी गई वस्तु एक सूची है या किसी सूची में डाली जा सकती है?


हो सकता है कि आपको यहां जवाब मिल जाए stackoverflow.com/questions/755200/…
मक्सिम कोंडराट्युक

जवाबों:


94
using System.Collections;

if(value is IList && value.GetType().IsGenericType) {

}

4
यह काम नहीं करता है - मैं निम्न अपवाद प्राप्त - मूल्य IList सामान्य प्रकार का उपयोग कर रहा है 'System.Collections.Generic.IList <टी>' की आवश्यकता है '1' प्रकार तर्क

15
आपको System.Collections का उपयोग करके जोड़ना होगा; अपने स्रोत फ़ाइल के शीर्ष पर। मैंने जो IList इंटरफ़ेस सुझाया है वह जेनेरिक संस्करण नहीं है (इसलिए दूसरा चेक)
जेम्स कॉवरेस

1
आप सही हे। यह एक आकर्षण की तरह काम करता है। मैं अपनी वॉच विंडो में इसका परीक्षण कर रहा था और लापता नामस्थान के बारे में सब भूल गया। मुझे यह उपाय बेहतर है, बहुत सरल

3
यह काम नहीं करता है। मैं 4.0 IList <T>! = IList में अनुमान लगाऊंगा? वैसे भी, मुझे यह जांचना था कि क्या यह सामान्य और IEnumerable है, और फिर उस संपत्ति के अस्तित्व की जांच करें जिसे मैं जांचना चाहता था, "गणना"। मुझे लगता है कि यह कमजोरी आंशिक रूप से है क्यों WCF आपकी सभी सूची <T> के T [] में बदल जाता है।

1
@ ईजा गलत। यह आमतौर पर काम करता है List<T>और ObservableCollection<T>लागू होता है IList
HappyNomad

121

आप लोगों के लिए जो विस्तार विधियों के उपयोग का आनंद लेते हैं:

public static bool IsGenericList(this object o)
{
    var oType = o.GetType();
    return (oType.IsGenericType && (oType.GetGenericTypeDefinition() == typeof(List<>)));
}

तो, हम कर सकते हैं:

if(o.IsGenericList())
{
 //...
}

3
.Net कोर के लिए यह थोड़ा संशोधित किया जाना चाहिएreturn oType.GetTypeInfo().IsGenericType && oType.GetGenericTypeDefinition() == typeof(List<>);
रोब एल

एक जादू की तरह काम करता है! यदि आपके पास केवल वस्तु नहीं है तो यह आपके लिए काम करेगा! धन्यवाद!!
gatsby

IList<>इसके बजाय के लिए जाँच सुरक्षित होगा?
nl-x


6
public bool IsList(object value) {
    return value is IList 
        || IsGenericList(value);
}

public bool IsGenericList(object value) {
    var type = value.GetType();
    return type.IsGenericType
        && typeof(List<>) == type.GetGenericTypeDefinition();
}

5
if(value is IList && value.GetType().GetGenericArguments().Length > 0)
{

}

मुझे लगता है कि आपको GetType () जैसे कॉल की आवश्यकता है। value.GetType () GetGenericArmentsments ())। लंबाई> 0
स्कॉट्स

4

विक्टर रोड्रिग्स के जवाब के आधार पर, हम जेनरिक के लिए एक और तरीका तैयार कर सकते हैं। वास्तव में, मूल समाधान को केवल दो पंक्तियों में घटाया जा सकता है:

public static bool IsGenericList(this object Value)
{
    var t = Value.GetType();
    return t.IsGenericType && t.GetGenericTypeDefinition() == typeof(List<>);
}

public static bool IsGenericList<T>(this object Value)
{
    var t = Value.GetType();
    return t.IsGenericType && t.GetGenericTypeDefinition() == typeof(List<T>);
}

3

यहाँ एक कार्यान्वयन है जो .NET मानक में काम करता है, और इंटरफेस के खिलाफ काम करता है:

    public static bool ImplementsGenericInterface(this Type type, Type interfaceType)
    {
        return type
            .GetTypeInfo()
            .ImplementedInterfaces
            .Any(x => x.GetTypeInfo().IsGenericType && x.GetGenericTypeDefinition() == interfaceType);
    }

और यहाँ परीक्षण (xunit) हैं:

    [Fact]
    public void ImplementsGenericInterface_List_IsValidInterfaceTypes()
    {
        var list = new List<string>();
        Assert.True(list.GetType().ImplementsGenericInterface(typeof(IList<>)));
        Assert.True(list.GetType().ImplementsGenericInterface(typeof(IEnumerable<>)));
        Assert.True(list.GetType().ImplementsGenericInterface(typeof(IReadOnlyList<>)));
    }

    [Fact]
    public void ImplementsGenericInterface_List_IsNotInvalidInterfaceTypes()
    {
        var list = new List<string>();
        Assert.False(list.GetType().ImplementsGenericInterface(typeof(string)));
        Assert.False(list.GetType().ImplementsGenericInterface(typeof(IDictionary<,>)));
        Assert.False(list.GetType().ImplementsGenericInterface(typeof(IComparable<>)));
        Assert.False(list.GetType().ImplementsGenericInterface(typeof(DateTime)));
    }

1

मैं निम्नलिखित कोड का उपयोग कर रहा हूं:

public bool IsList(Type type) => IsGeneric(type) && (
            (type.GetGenericTypeDefinition() == typeof(List<>))
            || (type.GetGenericTypeDefinition() == typeof(IList<>))
            );

0

संभवतः सबसे अच्छा तरीका कुछ ऐसा करना होगा:

IList list = value as IList;

if (list != null)
{
    // use list in here
}

यह आपको अधिकतम लचीलापन देगा और आपको कई अलग-अलग प्रकारों के साथ काम करने की अनुमति देगा जो IListइंटरफ़ेस को लागू करते हैं ।


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