Sto progettando una libreria basata su  web scraping  che tenta di fornire un'API a un sito di notizie popolare. Sto rappresentando ciascuno dei suoi articoli come una raccolta di "elementi" (   IElement   ), come immagini, video, blocchi di testo, colonne sonore, ecc. Il problema è che non riesco a pensare a nulla che ogni "elemento" abbia in comune. 
- Testo? No, le immagini (e i video e le colonne sonore) non hanno testo.
 - Un URL per accedere al file? No; mentre visiterò un URL remoto per accedere a un'immagine oa un video (poiché non è pratico passarne quelli in giro), non ho bisogno di andare su un URL per ottenere il testo (posso solo passarlo come stringa) .
 
L'unica cosa che posso pensare è avere un membro che descriva il tipo di elemento, ma che potrebbe potenzialmente portare a un'API molto intuitiva. Non voglio che la mia API finisca in questo modo:
// API code
enum ElementType
{
    Text, Hyperlink, Image, Video, Soundtrack
}
interface IArticle
{
    IEnumerable<IElement> Contents { get; }
}
interface IElement
{
    ElementType Type { get; }
}
class TextElement : IElement { /*details*/ }
class ImageElement : IElement { /*details*/ }
// .. and so on
// Usage in app code
foreach (var element in article.Contents)
{
    switch (element.Type)
    {
        case ElementType.Text:
            RenderText(((TextElement)element).Text);
            break;
        case ElementType.Image:
            DisplayImage(GetImageFromUri(((ImageElement)element).ImageUri));
            break;
        // and so on
    }
}
 Come puoi vedere, in questo scenario viene aggiunta molta verbosità perché l'utente deve 1) attivare il tipo di elemento, 2) controllare per ogni   ElementType   , e poi 3) downcast per usare l'implementazione specifica caratteristiche. 
Esiste un'alternativa al controllo / downcasting del tipo di runtime disordinato in questo scenario? In che modo altre app client (ad esempio i client Facebook / Twitter) gestiscono questo tipo di problema?