從代碼我們怎麼能知道一個類實現了哪些接口?哪個接口一個類實現?
例子:
interface IDrink
interface IEat
class Milk : IDrink
class Water: IDrink
class Potato: IEat
我想知道,如果馬鈴薯實現IDrink與否。我該怎麼做?
。
使用這樣:
我已經接收一個「object myObject
」一個方法,我需要看到,如果我將它轉換爲IDrink或IEAT。
從代碼我們怎麼能知道一個類實現了哪些接口?哪個接口一個類實現?
例子:
interface IDrink
interface IEat
class Milk : IDrink
class Water: IDrink
class Potato: IEat
我想知道,如果馬鈴薯實現IDrink與否。我該怎麼做?
。
使用這樣:
我已經接收一個「object myObject
」一個方法,我需要看到,如果我將它轉換爲IDrink或IEAT。
您可以投射它(這可能會引發異常)或使用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
等。
這是一個騙子的位,但這裏有幾個鏈接,告訴你如何找出對象實現的接口。
http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/600b6a24-8289-4ad6-a0a6-da354ab6923e/ http://www.hanselman.com/blog/DoesATypeImplementAnInterface.aspx
希望這有助於。
可以使用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) {
// ...
}
}
你可以這樣做此:
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:假
不工作:P我之前試過這個 – Dryadwoods 2009-09-05 22:04:46
對不起,畢竟你是對的:bool isOrNot = typeof(IDrink).IsInstanceOfType(myObject); – Dryadwoods 2009-09-05 22:11:55
「is」運算符比使用Type.IsInstanceOfType方法快得多。 – 2009-09-05 22:24:37
因爲沒有人提到這個問題,你可以使用is
操作:
if (myObject is IEat)
//It looks like food
如果myObject的已經是零,那麼你會得到錯誤的結果。 – 2009-09-05 22:03:52
如果'myObject'爲null,則它沒有類型。 – 2009-09-05 22:05:06
如果我有兩個以上的接口,那就不好。 – Dryadwoods 2009-09-05 22:05:17