C# – 将’object’参数转换为该对象的类型?

C#

大家好,

我将一个对象传递给一个方法。

我想将该对象强制转换为特定的类,以便我可以执行自己的特定方法吗? 我怎样才能做到这一点?

Move( new Cat() ); Move( new Pigeon() ); public void Move(object objectToMove) { if(objectToMove== Cat) { Cat catObject = objectToMove as Cat; catObject.Walk(); } else if(objectToMove== Pigeon) { Rat pigeonObject = objectToMove as Pigeon; pigeonObject.Fly(); } } 

好吧,你可以像这样使用is关键字:

 if(objectToMove is Cat) { ... } else if(objectToMove is Pigeon) { ... } 

正确的方法是:

 public interface ICanMove { void Move(); } 

由Cat和Pigeon实施:

 public class Cat : ICanMove { public void Move() { /* do something */ } } public class Pigeon : ICanMove { public void Move() { /* do something */ } } 

然后像这样调用它:

 public void Move(ICanMove objectThatMoves) { objectThatMoves.Move(); } 

你获得了几件事:

  1. 您只能为实现该接口的对象调用Move(ICanMove objectThatMoves) 。 如果尝试传递其他对象,则程序将无法编译。
  2. 你失去了条件陈述。 如果您决定将一个实现ICanMoveDog添加到您的程序中,Move方法将无需任何修改即可正常工作。 在您的版本中,您将不得不更改方法。

想象一下,如果你的程序中有陈述,你会有多少工作?

一个小点…不使用as和更合适更正确,因为隐含的第二类检查是多余的。 要么按以下方式使用:

 Cat catObject = objectToMove as Cat; if(catObject!=null) catObject.Walk(); else { Pigeon pigeonObject = objectToMove as Pigeon; if(pigeonObject!=null) pigeonObject.Fly(); } 

或者直接演员,因为你确信它会成功; 这样既有效又更清晰: –

 if(objectToMove is Cat) { Cat catObject = (Cat)objectToMove; catObject.Walk(); } else if(objectToMove is Pigeon) { Pigeon pigeonObject = (Pigeon)objectToMove; pigeonObject.Fly(); } 

使用直接转换,如果失败则会得到exception,而不是null。 阅读代码的人将在没有上下文的情况下知道“我们不只是试图看看它是否可以被视为某种东西,我们确信我们已经确定它应该是可能的。

另一种不使用接口的解决方案是拥有基类并覆盖每个派生类中的Move()方法。

  abstract class Animal { public abstract void Move(); } public class Cat : Animal { public override void Move() { //Cat specific behavior } } public class Bird : Animal { public override void Move() { //Bird specific behavior } } 

我认为如果你拥有所有“动物”共有的属性或方法,使用基类会更好。 这样,您就不必在实现上述“IAnimal”接口的每个类中复制代码。

当然如果没有共同的元素接口工作正常。

您可以使用“is”运算符来检查对象是否是某个类的实现。

 if (objectToMove is Cat) 

只是你的一点变化,这是好事。

 Move( new Cat() ); Move( new Pigeon() ); public void Move(object objectToMove) { if(objectToMove is Cat) { Cat catObject = objectToMove as Cat; catObject.Walk(); } else if(objectToMove is Pigeon) { Rat pigeonObject = objectToMove as Pigeon; pigeonObject.Fly(); } } 

我要做的是:

 interface IAnimal { void Move(); } 

一个界面

那我的猫和我的小鸟:

 class Cat : IAnimal { public void Move() { //a cat moves by walking this.Walk(); } public void Walk() { //do logic } } class Bird : IAnimal { public void Move() { this.Fly(); } public void Fly() { //do fly logic } } 

所以,当你完成后,你得到这个:

 public void Move(IAnimal animal) { animal.Move(); } 

如果您想检查您的动物类型,您可以这样做:

 public void PrintType(IAnimal animal) { Console.WriteLine(typeof(animal)); //or Console.WriteLine(animal.GetType()); }