ฉันคิดว่าคุณไม่เพียงต้องการทราบว่าประเภทเป็นแบบทั่วไปหรือไม่ แต่ถ้าวัตถุเป็นตัวอย่างของประเภททั่วไปโดยไม่ทราบประเภทอาร์กิวเมนต์
มันไม่ง่ายอย่างน่าเสียดาย ไม่เลวร้ายนักหากประเภททั่วไปเป็นคลาส (เช่นในกรณีนี้) แต่อินเทอร์เฟซจะยากกว่า นี่คือรหัสสำหรับชั้นเรียน:
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)
{
Console.WriteLine(IsInstanceOfGenericType(typeof(List<>),
new List<string>()));
Console.WriteLine(IsInstanceOfGenericType(typeof(List<>),
new string[0]));
Console.WriteLine(IsInstanceOfGenericType(typeof(List<>),
new SubList()));
Console.WriteLine(IsInstanceOfGenericType(typeof(List<>),
new SubList<int>()));
}
class SubList : List<string>
{
}
class SubList<T> : List<T>
{
}
}
แก้ไข: ตามที่ระบุไว้ในความคิดเห็นสิ่งนี้อาจใช้ได้กับอินเทอร์เฟซ:
foreach (var i in type.GetInterfaces())
{
if (i.IsGenericType && i.GetGenericTypeDefinition() == genericType)
{
return true;
}
}
ฉันแอบสงสัยว่าอาจมีบางกรณีที่น่าอึดอัดใจในเรื่องนี้ แต่ฉันไม่พบว่ามันล้มเหลวในตอนนี้