2009-09-05 178 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