Tôi giả sử rằng bạn không chỉ muốn biết loại đó là chung chung, nhưng nếu một đối tượng là một thể hiện của một loại chung cụ thể, mà không biết các đối số loại.
Thật không đơn giản, thật không may. Nó không quá tệ nếu loại chung là một lớp (như trong trường hợp này) nhưng khó hơn cho các giao diện. Đây là mã cho một lớp:
using System;
using System.Collections.Generic;
using System.Reflection;
class Test
{
static bool IsInstanceOfGenericType(Type genericType, object instance)
{
Type type = instance.GetType();
while (type != null)
{
if (type.IsGenericType &&
type.GetGenericTypeDefinition() == genericType)
{
return true;
}
type = type.BaseType;
}
return false;
}
static void Main(string[] args)
{
// True
Console.WriteLine(IsInstanceOfGenericType(typeof(List<>),
new List<string>()));
// False
Console.WriteLine(IsInstanceOfGenericType(typeof(List<>),
new string[0]));
// True
Console.WriteLine(IsInstanceOfGenericType(typeof(List<>),
new SubList()));
// True
Console.WriteLine(IsInstanceOfGenericType(typeof(List<>),
new SubList<int>()));
}
class SubList : List<string>
{
}
class SubList<T> : List<T>
{
}
}
EDIT: Như đã lưu ý trong các bình luận, điều này có thể hoạt động cho các giao diện:
foreach (var i in type.GetInterfaces())
{
if (i.IsGenericType && i.GetGenericTypeDefinition() == genericType)
{
return true;
}
}
Tôi có một nghi ngờ lén lút có thể có một số trường hợp khó xử xung quanh vấn đề này, nhưng tôi không thể tìm thấy nó thất bại ngay bây giờ.