什么是检查引用是特定泛型类型的快速方法?

时间:2008-11-07 15:12:05

标签: c# reflection

如果我有一个参数是接口的方法,那么查看接口引用是否属于特定泛型类型的快速方法是什么?

更具体地说,如果我有:

interface IVehicle{}

class Car<T> : IVehicle {}

CheckType(IVehicle param)
{
    // How do I check that param is Car<int>?
}

我也必须在支票后投票。所以,如果有一种方法可以一石二鸟,让我知道。

6 个答案:

答案 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>的实例。