如果我有一个参数是接口的方法,那么查看接口引用是否属于特定泛型类型的快速方法是什么?
更具体地说,如果我有:
interface IVehicle{}
class Car<T> : IVehicle {}
CheckType(IVehicle param)
{
// How do I check that param is Car<int>?
}
我也必须在支票后投票。所以,如果有一种方法可以一石二鸟,让我知道。
答案 0 :(得分:10)
要检查param是否为Car<int>
,您可以正常使用“is”和“as”:
CheckType(IVehicle param)
{
Car<int> car = param as Car<int>;
if (car != null)
{
...
}
}
答案 1 :(得分:3)
或者,您可以这样做:
if(param is Car<int>)
{
// Hey, I'm a Car<int>!
}
答案 2 :(得分:1)
为什么不把它变成通用的?
interface IVehicle{}
class Car<T> : IVehicle {
public static bool CheckType(IVehicle param)
{
return param is Car<T>;
}
}
...
Car<string> c1 = new Car<string>();
Car<int> c2 = new Car<int>();
Console.WriteLine(Car<int>.CheckType(c1));
Console.WriteLine(Car<int>.CheckType(c2));
答案 3 :(得分:1)
根据您是否想知道,参考是基于通用类型原型还是专用原型,代码会有很大的不同。
专业的一个很简单,你可以使用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);
}
答案 4 :(得分:0)
我经常发现,如果我的代码要求我为特定类型编写支票,我可能做错了。但是,你没有给我们足够的背景来为我们提供建议。
这是否符合您的需求?
Car<int> carOfInt = param as Car<int>;
if (carOfInt != null)
{
// .. yes, it's a Car<int>
}
答案 5 :(得分:0)
使用“as”运算符一次完成所有操作。 “as”将返回您想要的类型的对象,如果您要检查的内容不匹配,则返回null。但这仅适用于参考类型。
interface IVehicle { }
class Car<T> : IVehicle
{
static Car<int> CheckType(IVehicle v)
{
return v as Car<int>;
}
}
“是”运算符可让您测试v
是否为Car<int>
的实例。