public bool IsList(object value)
{
Type type = value.GetType();
// Check if type is a generic list of any type
}
Cách tốt nhất để kiểm tra xem đối tượng đã cho có phải là danh sách hay có thể được truyền vào danh sách?
public bool IsList(object value)
{
Type type = value.GetType();
// Check if type is a generic list of any type
}
Cách tốt nhất để kiểm tra xem đối tượng đã cho có phải là danh sách hay có thể được truyền vào danh sách?
Câu trả lời:
using System.Collections;
if(value is IList && value.GetType().IsGenericType) {
}
List<T>
và ObservableCollection<T>
thực hiện IList
.
Đối với những bạn thích sử dụng các phương pháp mở rộng:
public static bool IsGenericList(this object o)
{
var oType = o.GetType();
return (oType.IsGenericType && (oType.GetGenericTypeDefinition() == typeof(List<>)));
}
Vì vậy, chúng tôi có thể làm:
if(o.IsGenericList())
{
//...
}
return oType.GetTypeInfo().IsGenericType && oType.GetGenericTypeDefinition() == typeof(List<>);
IList<>
Thay vào đó, kiểm tra có an toàn hơn không?
bool isList = o.GetType().IsGenericType
&& o.GetType().GetGenericTypeDefinition() == typeof(IList<>));
if(value is IList && value.GetType().GetGenericArguments().Length > 0)
{
}
Dựa trên câu trả lời của Victor Rodrigues, chúng ta có thể nghĩ ra một phương pháp khác cho thuốc generic. Trên thực tế, giải pháp ban đầu có thể được rút gọn chỉ còn hai dòng:
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>);
}
Đây là một triển khai hoạt động trong .NET Standard và hoạt động dựa trên các giao diện:
public static bool ImplementsGenericInterface(this Type type, Type interfaceType)
{
return type
.GetTypeInfo()
.ImplementedInterfaces
.Any(x => x.GetTypeInfo().IsGenericType && x.GetGenericTypeDefinition() == interfaceType);
}
Và đây là các bài kiểm tra (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)));
}
Tôi đang sử dụng mã sau:
public bool IsList(Type type) => IsGeneric(type) && (
(type.GetGenericTypeDefinition() == typeof(List<>))
|| (type.GetGenericTypeDefinition() == typeof(IList<>))
);
Có lẽ cách tốt nhất là làm điều gì đó như sau:
IList list = value as IList;
if (list != null)
{
// use list in here
}
Điều này sẽ mang lại cho bạn sự linh hoạt tối đa và cũng cho phép bạn làm việc với nhiều kiểu triển khai IList
giao diện khác nhau .