C#:如何使用反射来投射物体?

时间:2011-02-14 09:17:49

标签: c# reflection

public static void myMethod(Object myObject)
{

}

我的对象是SportCar类型。如何创建新对象(像这样的东西)

SportCart sportCar = myObject as SportCar

稍后编辑:我不知道myObject的类型是什么。它可能是SimpleCar,AbcCar等

3 个答案:

答案 0 :(得分:4)

这通常是您使用界面的地方。在你的情况下,myMethod必须使用传入的参数做一些特定的事情。让我们举一个简单的例子;说myMethod负责启动汽车,你会定义一个界面,如

public interface ICar
{
    void Start()
}

然后myMethod的参数类型为ICar,而不是object

public void myMethod(ICar car)
{
   car.Start();
}

现在mymethod不需要知道(或关心!!)所呈现的ICar,无论是AbcCar,SportsCar等,只要该类实现ICar

public class SportsCar : ICar
{
   public void Start() 
   {
      Console.WriteLine("Vroom Vroom. SportsCar has started");
   }
}

public class AbcCar : ICar
{
   public void Start() 
   {
      Console.WriteLine("Chug Chug. AbcCar has started");
   }
}

答案 1 :(得分:1)

听起来你想要两件事之一。要么具有基类Car,要么具有汽车拥有的所有共享行为的接口ICar,然后您可以执行此操作:

ICar car = myObjectAsCar;
car.Drive(Speed.VeryFast);

或者,你想要做不同的事情,这取决于它是什么类型的汽车:

if (SportCar sporty = myObject as SportCar)
{
     sporty.Drive(Speed.VeryFast);
}
if (HybridCar hybrid = myObject as HybridCar)
{
     hybrid.Drive(Speed.Economical);
}

答案 2 :(得分:0)

汽车类是否有一个共同类型,你只想投射到那个:。

BaseCar baseCar = myObject as BaseCar;

或者您是先尝试检查类型,然后转换为正确的类型,即:

if(myObject is SimpleCar)
{
  var simpleCar = myObject as SimpleCar;
}

如果你想做第二次,我强烈建议你使用第一种。如果您使用的是第一辆汽车,则无需担心汽车的类型。