2011-08-23 70 views
0

我有类:为什么MediaItem不能转换为SecureMediaItem?

[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; 

然而即时得到一个错误:

Unable to cast object of type 'VLSCore2.Entities.Security.Api.MediaItem' to type 'VLSCore2.Entities.Security.Api.SecureMediaItem'.

这只是一个简单的widending投是不?阻止它像DataContract属性的东西?

回答

5

不是。这是与广泛演员阵营相反的。 SecureMediaItemMediaItem更具体。您可以将SecureMediaItem投射到MediaItem,因为SecureMediaItemMediaItem。反过来是不行的,因为MediaItem不一定是SecureMediaItem

+0

正确如此如果我有一个媒体项目的集合,我想把它放到一个安全的媒体项目,那么我该怎么做? – Exitos

+0

这是可能的,因为* that *会是一个扩大的演员:'var dummyItems = new List (); dummyItems.Add(新的SecureMediaItem()); // < - 完全有效'。 –

+0

顺便说一句:你得到的错误是一个运行时错误。最有可能的是,您试图转换的项目只是一个“MediaItem”而不是“SecureMediaItem”。以下代码将导致此错误:'var dummyItems = new List (); dummyItems.Add(new MediaItem()); var x =(SecureMediaItem)dummyItems [0];'。 –

0

除了@丹尼尔的话,可能会更直观的了解这一点,如果你想像一个圆形的MediaItem,延伸它你得到一个更大的圆圈SecureMediaItem。在这种情况下铸造就像切片你选择的圆圈。你不能切片较小圈获得较大一。

也就是说......

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 

由于特定的形状碰巧是一个圆形,因此投射到一个圆的工作。然而,投向广场失败的原因是,当广场是形状时,形状不一定是正方形,而圆形绝对不是正方形。

在你的情况,你正在尝试像一个SecureMediaItem对待MediaItem。这类似于将形状视为正方形:当形状为正方形时它将起作用,但在圆形时不起作用。

有一种解决方法:define your own explicit conversion operator。不过,我不会推荐它,因为它在对象层次结构中快速松散。

相关问题