webForumDet fria alternativet

Genric, skapa Type T

.NETur .NET

4 svar · 497 visningar · startad av P

Medlem sedan jan. 20012 204 inlägg
Frågan#1

Nu har jag kört fast igen!

Har en funktion som ser ut så här:

public T function Hej<T>(...)
...kod...

Type tmp = //typ av ett objekt jag skapat.
object o = Hej<???>(...); här vill jag göra ett rekursivt anrop med typen tmp.

Jag vill alltså göra Hej<tmp>. Men det fungerar ju inte. Kan man på något sätt konvertera en vanlig Type till en generisk "type T". ?

Medlem sedan maj 20012 812 inlägg
#2

Du kan inte skicka in en Type när det förväntas ett object av typen T.

Du måste skapa ett nytt objekt av typen T för att klara av det.

public T Hej<T>(T t) where T : new()
{
 T tmp = new T();
 T tmp2 = Hej<T>(tmp);
}

Fast det känns inte riktigt som det är det som du vill göra, så det underlättar om du beskriver vad du vill att din funktion Hej<T> skall göra.

- M

Medlem sedan jan. 20012 204 inlägg
#3

Nja det är väl inte rikigt så...

Det är en OR-mapper. Loopar genom en klass och sen när jag kommer till en relation så vill jag hämta dess "klass" genom ett rekursivt anrop. Detta anrop ska ju ske med den typ som relationensklassen är av. Ussh blev rörigt...

Tänke bara om det fanns något smart sätt att konvertera från en vanlig Type till en "T" men det verkar det ju inte...

En fullösning som jag drar mig för att använda är väl något i stil med:

public T Hej<T>(int i)
{
        T result = Activator.CreateInstance<T>();
        return (T)Hej(result.GetType(),i);
}
public object Hej(Type t, int i)
{
         ...work...
}
Medlem sedan maj 20012 812 inlägg
#4

Det är en OR-mapper. Loopar genom en klass och sen när jag kommer till en relation så vill jag hämta dess "klass" genom ett rekursivt anrop

Generellt skulle jag avråda dig till att göra det, då du faktiskt inte vet om du vill använda den information i din applikation vid just det tillfälle som du visar ditt "huvudobjekt".

Här är ett extrem exempel:

Du har en kund till denna kund finns något som heter Order och för varje Order så finns det Orderrader till varje orderrad så finns en produkt...

Just denna kund är en väldig shopsugen kund och har lagt mer än 10.000 ordrar där man har handlat för minst 10 produkter till varje order. Om det nu är så att du vill kunna se denna kundsadress så är du inte intresserad av att se alla hans ordrar och vilka produkter som finns i varje order, du är bara intresserad av hans leveransadress.
Men ditt förslag så kommer du hämta alla denna orderinformation fast du inte behöver den, och detta tar prestanda.

Om du istället väljer att bara hämta den information som finns i kundtabellen och sedan hämtar övrig information när de behövs (kallas lazy-loading) så får du bättre prestanda...

om du ändå väljer att göra som du vill så får du göra din fullösning.

- M

Medlem sedan jan. 20012 204 inlägg
#5

Yepps, har du helt rätt i!

139 ms totalt · 3 externa anrop · v20260731065814-full.b746b907
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)