从代码中,我们如何知道一个类实现了哪些接口?
示例:
interface IDrink
interface IEat
class Milk : IDrink
class Water: IDrink
class Potato: IEat
我想知道Potato是否实现了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
等。
因为没有人提到,你可以使用is
运算符:
if (myObject is IEat)
//It looks like food
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
更新
例如:
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
is
运算符比使用 Type.IsInstanceOfType
方法要快得多。 - Martin Liversage这有点作弊,但是这里有几个链接可以向您展示如何查找对象实现的接口。
http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/600b6a24-8289-4ad6-a0a6-da354ab6923e/ http://www.hanselman.com/blog/DoesATypeImplementAnInterface.aspx
希望这可以帮到你。
myObject
为空,则它没有类型。 - Martin Liversageas
和is
不是很好用? - Martin Liversage