从代码我们怎么能知道一个类实现了哪些接口?哪个接口一个类实现?
例子:
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