无法将对象强制转换为它实现的接口-将接口强制转换为另一个接口

时间:2018-12-06 12:29:31

标签: c# inheritance interface casting architecture

我的问题的简短描述。我已经将通用对象(接口)作为参数传递给了我的方法。我需要调用一些对实现我的接口的对象子集来说通用的方法。我不想为每种类型的对象“拥有if()然后”。我们将其称为IVehicles接口。

public interface IVehicle 

{
    Object SomeValue { get;  }
}
public class Car : IVehicle{ //some code here}

由于未共享所有逻辑,因此无法向IVehicle添加方法。

我只需要在IVehicle的子集上调用SomePersonalValue。因此,我实现了另一个接口IPersonalVehicle并扩展了我的对象:

public interface IPersonalVehicle 

{
    long SomePersonalValue { get;  }
}
public class Car : IVehicle, IPersonalVehicle {}
public class MotorBike : IVehicle, IPersonalVehicle {}

现在我有了方法

public void Call(IVehicle vehicle)   
{
   Object someIrrelevantObject = vehicle.SomeValue;
   //here my change begins
   IPersonalVehicle personalVehicle = (IPersonalVehicle)vehicle; 
   long somePersonalValue = personalVehicle.SomePersonalValue;

}

问题是它引发了无法将对象Car投射到IPersonalVehicle接口的问题。我还尝试通过IVehicles扩展我的接口,并且重定义是相同的。

public interface IPersonalVehiclee : IVehiclee
{
    long SomePersonalValue { get;  }
}

我做错了什么?

编辑-已解决 我忘了或以某种方式丢失了代码编辑以通过IPersonalVehicle大声笑来扩展我的汽车和摩托车,所以该解决方案有效!不管怎么说,还是要谢谢你!

2 个答案:

答案 0 :(得分:1)

如果您正确地发布了问题,则可以正常运行:

class Program
{
    static void Main()
    {
        Call(new Car());

        Call(new MotorBike());
    }

    public static void Call(IVehicles vehicle)
    {
        Object someIrrelevantObject = vehicle.SomeValue;
        //here my change begins
        IPersonalVehicles personalVehicle = (IPersonalVehicles)vehicle;
        long somePersonalValue = personalVehicle.SomePersonalValue;
    }

}

public interface IVehicles

{
    Object SomeValue { get; }
}


public interface IPersonalVehicles

{
    long SomePersonalValue { get; }
}


public class Car : IVehicles, IPersonalVehicles
{
    public long SomePersonalValue => long.MinValue;

    public object SomeValue => "car value";
}

public class MotorBike : IVehicles, IPersonalVehicles
{
    public long SomePersonalValue => long.MaxValue;

    public object SomeValue => "motorbike value";
}

答案 1 :(得分:0)

我认为,如果您同时使用两个接口,则只需注入IPersonalVehicles(扩展了IVehicles)。不允许您将一个接口强制转换为其他接口,因为这没有任何意义。

尝试考虑一下:IPersonalVehicles有自己的属性(和方法),与IVehicles相同。那么,你怎么投他们呢?请记住,投射是基于继承的

让我知道我是否可以帮助您!