2008-11-07 39 views
0

如果我有一个参数是一个接口的方法,请问如果接口的引用是特定泛型类型的快速方法是什么?什么是检查该引用是否为特定泛型类型的快速方法?

更具体地说,如果我有:

interface IVehicle{} 

class Car<T> : IVehicle {} 

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

我也将不得不在检查后才能投放。所以如果有一种方法可以在这一块上一箭双雕,那就让我知道。

+0

你意味着汽车实施IVehicle? – 2008-11-07 15:15:31

+0

刚编辑它。我的错。 – 2008-11-07 15:15:55

回答

10

要检查如果param是Car<int>你可以用“是”和“为”正常:

CheckType(IVehicle param) 
{ 
    Car<int> car = param as Car<int>; 
    if (car != null) 
    { 
     ... 
    } 
} 
+0

Jon - 你的C#书很有帮助 - 感谢你和DNR的精彩采访。鉴于我的历史与你的建议,我倾向于盲目相信你!话虽如此,为什么尼克的反应(直接使用)是更好的方法呢? – 2008-11-07 15:52:04

0

我经常发现,如果我的代码需要我写检查特定类型的,我可能做错了什么。虽然你没有给我们足够的背景给我们提供建议。

这是否符合您的需求?

Car<int> carOfInt = param as Car<int>; 
if (carOfInt != null) 
{ 
    // .. yes, it's a Car<int> 
} 
0

使用“as”操作符一次性完成所有操作。 “as”将返回所需类型的对象,如果您检查的内容不匹配,则返回null。但这只适用于参考类型。

interface IVehicle { } 
class Car<T> : IVehicle 
{ 
    static Car<int> CheckType(IVehicle v) 
    { 
     return v as Car<int>; 
    } 
} 

的“是”运营商将让你测试,看看是否vCar<int>一个实例。

3

或者,你可以这样做:

if(param is Car<int>) 
{ 
    // Hey, I'm a Car<int>! 
} 
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)); 
1

的代码不同,这取决于你是否想知道,如果参考是基于一个通用型的原型,或专门的一个相当显着。

专业性的很容易,你可以只使用is

CheckType(IVehicle param) 
{ 
    var isofYourType = param is Car<int>; 
    ... 
} 

或安全投,如图所示之前:你想知道

CheckType(IVehicle param) 
{ 
    var value = param as Car<int>; 
    if(value != null)  
     ... 
} 

在案件是否尤尔VAR只是Car<T>的一些专业化,事情变得非常难看。 而最后你应该的事情要担心的是速度在这种情况下,因为那会是比代码甚至丑陋:

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); 
} 
相关问题