为什么不能将MediaItem强制转换为SecureMediaItem?

时间:2011-08-23 12:39:48

标签: c# wcf

我有课程:

    [DataContract]
    public class MediaItem : Video
    {
        //used to protect calling api from the incorrectly named video
    }

    [DataContract]
    public class SecureMediaItem : MediaItem
    {
        [DataMember]
        public PlayerEmbedToken Token;
    }

然后我有以下代码:

List<MediaItem> dummyItems = new List<MediaItem>();

 //cast the media item into a secure media item
SecureMediaItem retItem = (SecureMediaItem)dummyItems[mediaId];

//TODO: put in the Admin ID
retItem.Token.UserId = 1;
retItem.Token.IpAddress = VLSCore2.VlsSecurity.ParseIpFromString(ipAddress);
retItem.Token.UniquePlayerRef = Guid.NewGuid().ToString();


return retItem;

但是我收到了错误:

  

无法投射类型的对象   输入'VLSCore2.Entities.Security.Api.MediaItem'   'VLSCore2.Entities.Security.Api.SecureMediaItem'。

这只是一个广泛的演员,不是吗?像DataContract属性那样停止它的东西?

3 个答案:

答案 0 :(得分:5)

没有。这与扩大的演员阵营相反。 SecureMediaItemMediaItem更具体。您可以将SecureMediaItem投射到MediaItem,因为SecureMediaItemMediaItem。反过来说不起作用,因为MediaItem不一定是SecureMediaItem

答案 1 :(得分:0)

除了@Daniel的话,可能会更直观地理解这一点,如果你像MediaItem一样想象一个圆圈,那么扩展它就会得到一个更大的圆圈SecureMediaItem。在这种情况下,施放就像切割您选择的圆圈一样。您无法对较小的圈进行切片以获得更大一个。

那是......

答案 2 :(得分:0)

你得到的错误是有道理的:你有一个父项列表,但你正在尝试执行向下转换。标准的例子是这样的:

public class Shape { ... }

public class Circle : Shape
{
   public void FillCircle();
}

public class Square : Shape
{
   public void FillSquare();
}

...

Shape s = new Circle();
s.FillCircle();  // won't compile
Circle c = (Circle) s;
c.FillCircle();  // dangerous, but works
Square sq = (Square) s;  // runtime error

投射到圆形是有效的,因为特定形状恰好是圆形。但是,对Square的强制转换失败是因为Square是Shape,Shape不一定是Square而Circle绝对不是Square。

在您的情况下,您正在尝试将MediaItem视为SecureMediaItem。这类似于将形状视为方形:当形状为正方形时,它将起作用,但当它是圆形时,它将起作用。

有一种解决方法:define your own explicit conversion operator。但是,我不推荐它,因为它与你的对象层次结构一起快速而松散。