Код довольно сильно отличается в зависимости от того, хотите ли вы знать, основана ли ссылка на прототипе универсального типа или специализированном.
Специализированный прост, вы можете просто использовать is
:
CheckType(IVehicle param)
{
var isofYourType = param is Car<int>;
...
}
или безопасное приведение, как показано ранее:
CheckType(IVehicle param)
{
var value = param as Car<int>;
if(value != null)
...
}
Если вы захотите узнать, является ли yur var просто какой-то специализацией Car<T>
, все становится действительно ужасным
И последнее, о чем вам следует беспокоиться, это скорость в этом случае, потому что это будет даже хуже, чем код g :
class Car<T>
{ }
interface IVehicle { }
class YourCar : Car<int>, IVehicle
{ }
static bool IsOfType(IVehicle param)
{
Type typeRef = param.GetType();
while (typeRef != null)
{
if (typeRef.IsGenericType &&
typeRef.GetGenericTypeDefinition() == typeof(Car<>))
{
return true;
}
typeRef = typeRef.BaseType;
}
return false;
}
static void Main(string[] args)
{
IVehicle test = new YourCar();
bool x = IsOfType(test);
}