public bool IsList(object value)
{
Type type = value.GetType();
// Check if type is a generic list of any type
}
Jaki jest najlepszy sposób sprawdzenia, czy dany obiekt jest listą, czy może być rzutowany na listę?
public bool IsList(object value)
{
Type type = value.GetType();
// Check if type is a generic list of any type
}
Jaki jest najlepszy sposób sprawdzenia, czy dany obiekt jest listą, czy może być rzutowany na listę?
Odpowiedzi:
using System.Collections; if(value is IList && value.GetType().IsGenericType) { }
źródło
List<T>
iObservableCollection<T>
wdrożyćIList
.Dla was, którzy lubią korzystać z metod rozszerzających:
public static bool IsGenericList(this object o) { var oType = o.GetType(); return (oType.IsGenericType && (oType.GetGenericTypeDefinition() == typeof(List<>))); }
Mogliśmy więc zrobić:
if(o.IsGenericList()) { //... }
źródło
return oType.GetTypeInfo().IsGenericType && oType.GetGenericTypeDefinition() == typeof(List<>);
IList<>
zamiast tego byłoby bezpieczniejsze?bool isList = o.GetType().IsGenericType && o.GetType().GetGenericTypeDefinition() == typeof(IList<>));
źródło
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(); }
źródło
if(value is IList && value.GetType().GetGenericArguments().Length > 0) { }
źródło
Opierając się na odpowiedzi Victora Rodriguesa, możemy opracować inną metodę dla leków generycznych. W rzeczywistości oryginalne rozwiązanie można sprowadzić tylko do dwóch wierszy:
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>); }
źródło
Oto implementacja, która działa w standardzie .NET Standard i działa na interfejsach:
public static bool ImplementsGenericInterface(this Type type, Type interfaceType) { return type .GetTypeInfo() .ImplementedInterfaces .Any(x => x.GetTypeInfo().IsGenericType && x.GetGenericTypeDefinition() == interfaceType); }
A oto testy (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))); }
źródło
Używam następującego kodu:
public bool IsList(Type type) => IsGeneric(type) && ( (type.GetGenericTypeDefinition() == typeof(List<>)) || (type.GetGenericTypeDefinition() == typeof(IList<>)) );
źródło
Prawdopodobnie najlepszym sposobem byłoby zrobienie czegoś takiego:
IList list = value as IList; if (list != null) { // use list in here }
Zapewni to maksymalną elastyczność, a także umożliwi pracę z wieloma różnymi typami, które implementują
IList
interfejs.źródło