2009-09-05 131 views
3

从代码我们怎么能知道一个类实现了哪些接口?哪个接口一个类实现?

例子:

interface IDrink 
interface IEat 

class Milk : IDrink  
class Water: IDrink  
class Potato: IEat 

我想知道,如果马铃薯实现IDrink与否。我该怎么做?

使用这样:

我已经接收一个“object myObject”一个方法,我需要看到,如果我将它转换为IDrink或IEAT。

回答

10

您可以投射它(这可能会引发异常)或使用as运算符。

private void DrinkIt(Object o) { 
    IDrink possibleDrink = o as IDrink; 

    if (possibleDrink == null) 
     Console.WriteLine("Not a drink!"); 
    else { 
     ChugItDown(possibleDrink); 
     Console.WriteLine("That hit the spot!"); 
    } 
} 

不要紧多少接口o工具 - 你在这里是如果它是一个IDrink只是感兴趣。如果你想获得一个完整的清单,你必须使用反射(System.Reflection):

Type [] interfaces = myObject.GetType().GetInterfaces(); 

当然,myObject不应该null - 作为一个null没有类型。然后您可以检查interfaces是否包含IDrink,IEat等。

2

可以使用as操作:

void Method(Object myObject) { 
    IDrink drink = myObject as IDrink; 
    if (drink != null) { 
    // Use the IDrink interface. 
    } 
} 

如果你只是想测试的界面,而不是使用它,你可以使用is操作:

void Method(Object myObject) { 
    if (myObject is IDrink) { 
    // ... 
    } 
} 
+1

如果myObject的已经是零,那么你会得到错误的结果。 – 2009-09-05 22:03:52

+1

如果'myObject'为null,则它没有类型。 – 2009-09-05 22:05:06

+0

如果我有两个以上的接口,那就不好。 – Dryadwoods 2009-09-05 22:05:17

1

你可以这样做此:

typeof(IDrink).IsInstanceOf(myObject) 

有关详细信息,请参阅MSDN: http://msdn.microsoft.com/en-us/library/system.type.isinstanceoftype.aspx

UPDATE

例如:

public interface IDrink{} 
public interface IEat{} 

public class Milk : IDrink{} 
public class Water: IDrink {} 
public class Potato : IEat { } 


class Program 
{ 
    static void Main(string[] args) 
    { 
     object milk = new Milk(); 
     Console.WriteLine("Is Milk an IDrink: {0}", 
      typeof(IDrink).IsInstanceOfType(milk)); 
     Console.WriteLine("Is Milk an IEat: {0}", 
      typeof(IEat).IsInstanceOfType(milk)); 

     Console.ReadLine(); 
    } 
} 

产生输出:

是牛奶的IDrink:真 是牛奶的IEAT:假

+0

不工作:P我之前试过这个 – Dryadwoods 2009-09-05 22:04:46

+0

对不起,毕竟你是对的:bool isOrNot = typeof(IDrink).IsInstanceOfType(myObject); – Dryadwoods 2009-09-05 22:11:55

+0

“is”运算符比使用Type.IsInstanceOfType方法快得多。 – 2009-09-05 22:24:37

7

因为没有人提到这个问题,你可以使用is操作:

if (myObject is IEat) 
    //It looks like food