哪个接口一个类实现?

时间:2009-09-05 21:58:55

标签: c# asp.net

从代码中我们如何知道一个类实现哪些接口?

示例:

interface IDrink
interface IEat

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

我想知道Potato是否实现了IDrink。我该怎么办?

使用此:

我有一种方法可以接收一个“object myObject”,我需要查看是否将其转换为IDrink或IEat。

5 个答案:

答案 0 :(得分: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是否包含IDrinkIEat等。

答案 1 :(得分:7)

因为没有人提及它,您可以使用is运算符:

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

答案 2 :(得分: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) {
     // ...
  }
}

答案 3 :(得分:1)

有点作弊,但这里有几个链接向您展示如何找出对象实现的接口。

http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/600b6a24-8289-4ad6-a0a6-da354ab6923e/ http://www.hanselman.com/blog/DoesATypeImplementAnInterface.aspx

希望这有帮助。

答案 4 :(得分:1)

你可以这样做:

typeof(IDrink).IsInstanceOf(myObject)

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

<强>更新

例如:

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();
    }
}

产生输出:

  

牛奶是否为ID:真实   牛奶是IEat:False