public bool IsList(object value)
{
Type type = value.GetType();
// Check if type is a generic list of any type
}
প্রদত্ত বস্তুটি একটি তালিকা, বা একটি তালিকায় কাস্ট করা যায় কিনা তা যাচাই করার সর্বোত্তম উপায় কী?
public bool IsList(object value)
{
Type type = value.GetType();
// Check if type is a generic list of any type
}
প্রদত্ত বস্তুটি একটি তালিকা, বা একটি তালিকায় কাস্ট করা যায় কিনা তা যাচাই করার সর্বোত্তম উপায় কী?
উত্তর:
using System.Collections;
if(value is IList && value.GetType().IsGenericType) {
}
List<T>
এবং ObservableCollection<T>
কার্যকর করে IList
।
আপনার ছেলেরা যারা এক্সটেনশন পদ্ধতির ব্যবহার উপভোগ করেন:
public static bool IsGenericList(this object o)
{
var oType = o.GetType();
return (oType.IsGenericType && (oType.GetGenericTypeDefinition() == typeof(List<>)));
}
সুতরাং, আমরা কি করতে পারি:
if(o.IsGenericList())
{
//...
}
return oType.GetTypeInfo().IsGenericType && oType.GetGenericTypeDefinition() == typeof(List<>);
IList<>
পরিবর্তে চেক করা কি নিরাপদ হবে?
bool isList = o.GetType().IsGenericType
&& o.GetType().GetGenericTypeDefinition() == typeof(IList<>));
ভিক্টর রডরিগসের উত্তরের ভিত্তিতে আমরা জেনেরিকের জন্য অন্য একটি পদ্ধতি তৈরি করতে পারি। আসলে, মূল সমাধানটি কেবল দুটি লাইনে হ্রাস করা যেতে পারে:
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>);
}
এখানে একটি বাস্তবায়ন যা। নেট স্ট্যান্ডার্ডে কাজ করে এবং ইন্টারফেসের বিরুদ্ধে কাজ করে:
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)));
}
আমি নিম্নলিখিত কোড ব্যবহার করছি:
public bool IsList(Type type) => IsGeneric(type) && (
(type.GetGenericTypeDefinition() == typeof(List<>))
|| (type.GetGenericTypeDefinition() == typeof(IList<>))
);
সম্ভবত সবচেয়ে ভাল উপায় হবে এরকম কিছু করা:
IList list = value as IList;
if (list != null)
{
// use list in here
}
এটি আপনাকে সর্বোচ্চ নমনীয়তা দেবে এবং IList
ইন্টারফেস প্রয়োগকারী বিভিন্ন ধরণের সাথেও আপনাকে কাজ করার অনুমতি দেবে ।