从代码中我们如何知道一个类实现哪些接口?
示例:
interface IDrink
interface IEat
class Milk : IDrink
class Water: IDrink
class Potato: IEat
我想知道Potato是否实现了IDrink。我该怎么办?
使用此:
我有一种方法可以接收一个“object myObject
”,我需要查看是否将其转换为IDrink或IEat。
答案 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
是否包含IDrink
,IEat
等。
答案 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