webForumDet fria alternativet

Typcastning med Linqobjekt

.NET

4 svar · 450 visningar · startad av maqe

Medlem sedan dec. 2003824 inlägg
Frågan#1

Jag håller på med en enkel webbapplikation och testar lite Linq. Jag får problem när jag ska typa om ett objekt och tänket kollar om någon här har någon lösning på mitt problem. Nedan kommer lite kod med förklaring.

Item.cs (this is a auto generated file)

PageItem.cs ( This is a simple page class inheriting from Item.cs )

public class PageItem : Item {
 //Add som properties and stuff
}

Default.aspx.cs (A simple page inheriting from Page.cs)

public partial class _Default : Web.Page<PageItem> {
 //Do stuff 
}

Page.cs ( This will be my base class for easy access to some nifty stuff like CurrentPage)

public abstract class Page : System.Web.UI.Page where TPage : Item {
 public virtual TPage CurrentPage {
   get {
    MyDataContext db = new MyDataContext();
    return (TPage)db.Items.Single(p => p.ID == 1); // <- Problem
  }
 }
}

Koden ovan ger mig problem, det verkar som att man inte kan typa om ett objekt av typen Item till PageItem fast PageItem ärver från Item.
Så hur skulle jag kunna lösa detta på ett annat sätt?

Medlem sedan mars 20007 896 inlägg
#2

Nej, det går inte. Däremot går det att typa om ett PageItem till ett Item. Man kan aldrig typa om till ett "barn" av en superklass - enbart föräldrar/superklass.

Medlem sedan dec. 2003824 inlägg
#3

hm okay så jag kan aldrig typa om min basklass "Item" till ärvd klass "PageItem"?
Så hela konstruktionen är galen menar du?

Medlem sedan dec. 2003824 inlägg
#4

Nu tror jag att jag förstått problemet. Problemet är att db.Items bara innehåller ContentItems och dom går inte att typa om till en subklass precis som du sa. Då är frågan om det går att göra så att Linq skapar instanser av rätt typ när mina Items skapas?

Medlem sedan dec. 2003824 inlägg
#5

Jag har fått för mig om att jag måste använda IsDiscriminator = true på min typ som t.ex:

[Column(Storage = "_Type", DbType = "VarChar(255)", IsDiscriminator = true)]

Sedan måste jag nog använda InheritanceMapping för att skapa upp insansen av rätt typ.

[InheritanceMapping(Code = "String", Type = typeof(dynamisk information från type kolumnen), IsDefault = true)]

Då är frågan hur jag kan sätta Type till värdet av min kolumn Type som är Discriminitor?

261 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)