【问题标题】:Unable to cast object to interface it implements - cast interface to another interface无法将对象转换为它实现的接口 - 将接口转换为另一个接口
【发布时间】:2019-05-08 03:44:38
【问题描述】:

我的问题的简短描述。我已将通用对象(接口)作为参数传递给我的方法。我需要调用一些对实现我的接口的对象子集很常见的方法。我不想为那里的每种类型的对象“拥有 if() then”。我们将接口称为 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 扩展我的汽车和摩托车大声笑,所以这个解决方案有效!不管怎么说,还是要谢谢你!

【问题讨论】:

  • 因为IVehicleIPersonalVehicle 之间没有任何关系。您可以将IPersonalVehicle 声明为interface IPersonalVehicle : IVehicle,它将允许您投下
  • 你能发布一个可以编译的代码吗?目前您有一个拼写错误,例如IVehiclesIVehicle
  • @Sanan Fataliyev 但在您的建议中,我认为我需要使用 SomePersonalValue 方法扩展所有实现 IVehicle 的类,还是我错了?
  • @Dennis 拼写错误已修复。
  • @SananFataliyev:可以,实现IFoo 的对象也可以实现IBar。从编译器和设计角度来看,此代码都是合法的。这并不意味着IFooIBar 必须以某种方式相关。

标签: c# inheritance interface casting architecture


【解决方案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";
}

【讨论】:

  • 天哪,我现在正在检查我的汽车和摩托车接口实现不知何故丢失了,哈哈,我会尝试重建并让你知道
【解决方案2】:

我认为如果你同时使用这两个接口,你可以只注入IPersonalVehicles(扩展IVehicles)。不允许您将一个接口转换为另一个接口,因为它没有意义。

试着思考一下:IPersonalVehicles 有自己的属性(和方法),IVehicles 也一样。那么,你怎么能施放它们呢?请记住,强制转换是基于继承的

如果我能帮助你,请告诉我!

【讨论】:

    猜你喜欢
    • 2023-01-28
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多