2011-08-23 131 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。不過,我不會推薦它,因爲它在對象層次結構中快速鬆散。

相關問題