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>);
}
यहाँ एक कार्यान्वयन है जो .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)));
}
मैं निम्नलिखित कोड का उपयोग कर रहा हूं:
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
इंटरफ़ेस को लागू करते हैं ।