一个类实现哪些接口?

3

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

示例:

interface IDrink
interface IEat

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

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

.

使用方法:

我有一个接收“object myObject”的方法,我需要看看它是否可以强制转换为IDrink或IEat。

5个回答

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等。


7

因为没有人提到,你可以使用is运算符:

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

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 为空,则它没有类型。 - Martin Liversage
@Dryadwoods:为什么在超过两个接口时,asis不是很好用? - Martin Liversage
当然,“as”和“is”也很好,但是当我评论说不好时,我是以需要N个条件到N个不同接口的方式来表达的。Vinay Sajip的解决方案更好,因为它首先测试我想要的东西(优先级)。 - Dryadwoods

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

会产生以下输出:

牛奶是一种饮料吗:True 牛奶是一种食品吗:False


抱歉,毕竟你是对的:bool isOrNot = typeof(IDrink).IsInstanceOfType(myObject); - Dryadwoods
is 运算符比使用 Type.IsInstanceOfType 方法要快得多。 - Martin Liversage

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接