প্রদত্ত মানটি জেনেরিক তালিকা কিনা তা আমি কীভাবে চেক করব?


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

প্রদত্ত বস্তুটি একটি তালিকা, বা একটি তালিকায় কাস্ট করা যায় কিনা তা যাচাই করার সর্বোত্তম উপায় কী?


আপনি এখানে উত্তর খুঁজে পেতে পারেন stackoverflow.com/questions/755200/…
মাকসিম Kondratyuk

উত্তর:


94
using System.Collections;

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

}

4
এটি কাজ করে না - আমি নিম্নলিখিত ব্যতিক্রম পেয়েছি - মান হল IList জেনেরিক টাইপ 'সিস্টেম.কলেশনস.জেনারিক.আইলিস্ট <T>' এর জন্য '1' টাইপ আর্গুমেন্ট প্রয়োজন

15
আপনাকে সিস্টেম.কালেকশনগুলি ব্যবহার করে যুক্ত করতে হবে; আপনার উত্স ফাইলের শীর্ষে। আমি প্রস্তাবিত আইলিস্ট ইন্টারফেসটি জেনেরিক সংস্করণ নয় (সুতরাং দ্বিতীয় চেক)
জেমস কভারেস

4
তুমি ঠিক বলছো. এটি একটি কবজির মতো কাজ করে। আমি আমার ওয়াচ উইন্ডোতে এটি পরীক্ষা করছিলাম এবং হারিয়ে যাওয়া নেমস্পেসের কথা ভুলে গিয়েছিলাম। আমি এই সমাধানটি আরও ভাল, খুব সহজ পছন্দ করেছি

4
এটি কাজ করে না। আমি 4.0 IList <T>! = আইলিস্টে অনুমান করব? যাইহোক, আমাকে এটি জেনেরিক এবং আইনামেবলযোগ্য কিনা তা পরীক্ষা করে দেখতে হয়েছিল এবং তারপরে যে সম্পত্তিটি আমি "কাউন্ট" চেক করতে চেয়েছি তার অস্তিত্বের জন্য পরীক্ষা করতে হয়েছিল। আমি মনে করি এই দুর্বলতা আংশিকভাবে কেন ডাব্লুসিএফ আপনার তালিকা <টি> এর সমস্ত তালিকা টি [] করে।

4
@ এডজা ভুল এটি সাধারণত কাজ করে List<T>এবং ObservableCollection<T>কার্যকর করে IList
শুভনোমাদ

121

আপনার ছেলেরা যারা এক্সটেনশন পদ্ধতির ব্যবহার উপভোগ করেন:

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

সুতরাং, আমরা কি করতে পারি:

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

4
নেট কোরের জন্য এটিকে কিছুটা সংশোধন করা দরকারreturn oType.GetTypeInfo().IsGenericType && oType.GetGenericTypeDefinition() == typeof(List<>);
রব এল

একটি যাদুমন্ত্র মত কাজ করে! যদি আপনার কাছে কেবল টাইপ না থাকে তবে এটি আপনার পক্ষে কাজ করবে! ধন্যবাদ !!
gatsby

IList<>পরিবর্তে চেক করা কি নিরাপদ হবে?
এনএল-এক্স


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)
{

}

আমি মনে করি আপনার গেটটাইপ () যেমন: মান.গেটটাইপ () .গেটজনারিক অরগমেন্টস () দৈর্ঘ্য> 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

এখানে একটি বাস্তবায়ন যা। নেট স্ট্যান্ডার্ডে কাজ করে এবং ইন্টারফেসের বিরুদ্ধে কাজ করে:

    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ইন্টারফেস প্রয়োগকারী বিভিন্ন ধরণের সাথেও আপনাকে কাজ করার অনুমতি দেবে ।


4
এটি যদি জিজ্ঞাসা করা হয় যে জেনেরিক তালিকাটি তা পরীক্ষা করে না ।
লুকাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.