Permalänk
Medlem

Reflection C#

Sitter med ett litet projekt som jag sprungit in i ett problem.

Jag har namnet på en class i en sträng.

Från den så skapar jag upp en assembly, sedan en type på ett object i classen, sedan skapar jag ett object av type:en.

Sedan sätter jag lite property's osv på detta.

Detta funkar bra.

Dock är problemet att mitt object extendar ett annat object, och mitt object vill jag sedan ha in i en array av det andra objektet.

Detta får jag inte till. Testat med lite olika, convert.changetype bla bla.

Får det att kompilera, men kan inte köra det, får då IConvertible-error, vilket ju är tämligen korrekt.

Om jag behöver bygga egna konvertible-klasser för varje tappar jag lite syftet då det finns nästan 200 objekt som extendar det andra.

Sedan har jag såklart försökt att stoppa in min "genericInstance" direkt i array:en, som går när man arbetar med de riktiga objekten, men här plockar den inte upp det.

Jag har förenklat det nedan, detta är bara vad jag har testat med just nu.

Assembly genericAssembly = Assembly.Load("myClass"); // Vi skapar sedan en instans av vårt objekt bla bla... Type genericType = genericAssembly.GetType("myClass.Object1"); // Vi instansierar vårt objekt object genericInstance = Activator.CreateInstance(genericType); Object2 OB2 = (Object2)Convert.ChangeType(genericInstance, genericType.GetType()); Object2[] ob2s= new Object2[1]; ob2s[1] = OB2; // Funkar ej //obs2[1] = genericInstance;

Visa signatur

På tok för många datorer för att skriva här

Permalänk
Medlem
Skrivet av orig_rejser:

Sitter med ett litet projekt som jag sprungit in i ett problem.

Jag har namnet på en class i en sträng.

Från den så skapar jag upp en assembly, sedan en type på ett object i classen, sedan skapar jag ett object av type:en.

Sedan sätter jag lite property's osv på detta.

Detta funkar bra.

Dock är problemet att mitt object extendar ett annat object, och mitt object vill jag sedan ha in i en array av det andra objektet.

Detta får jag inte till. Testat med lite olika, convert.changetype bla bla.

Får det att kompilera, men kan inte köra det, får då IConvertible-error, vilket ju är tämligen korrekt.

Om jag behöver bygga egna konvertible-klasser för varje tappar jag lite syftet då det finns nästan 200 objekt som extendar det andra.

Sedan har jag såklart försökt att stoppa in min "genericInstance" direkt i array:en, som går när man arbetar med de riktiga objekten, men här plockar den inte upp det.

Jag har förenklat det nedan, detta är bara vad jag har testat med just nu.

Assembly genericAssembly = Assembly.Load("myClass"); // Vi skapar sedan en instans av vårt objekt bla bla... Type genericType = genericAssembly.GetType("myClass.Object1"); // Vi instansierar vårt objekt object genericInstance = Activator.CreateInstance(genericType); Object2 OB2 = (Object2)Convert.ChangeType(genericInstance, genericType.GetType()); Object2[] ob2s= new Object2[1]; ob2s[1] = OB2; // Funkar ej //obs2[1] = genericInstance;

Nu har jag inte full koll på vad du är ute efter riktigt.
Objektet finns väl redan i arrayen?

Alltså, OB2 ska väl med andra ord ha samma information som genericInstance.
Antar att det skrivit fel obs2[1] = genericInstance ?

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem
Skrivet av NoPaiN^:

Nu har jag inte full koll på vad du är ute efter riktigt.
Objektet finns väl redan i arrayen?

Alltså, OB2 ska väl med andra ord ha samma information som genericInstance.
Antar att det skrivit fel obs2[1] = genericInstance ?

Jag har ju instanserat en array som består av typen object2, så det finns ingen object2 i obs2-array:en

men obs2 godkänner inte genericinstance även om den i sig kommer består av nedärvt object2-objekt.

så i array:en obs2 som är en array som vill ha object2 objekt vill jag ha in ett objekt1-objekt.

Mycket objekt

Men däremot om jag hade gjort

Object1 ob1 = new object1(); Object2[] obs2 = new object2[1]; obs2[1] = ob1;

Så hade det gått igenom... Så jag gör ju samma sak, men iom att jag går igenom en genericAssembly så ser den ju inte att objektet är samma eftersom genericinstans inte har någon speciell typ.

Nu måste det vara glasklart

Visa signatur

På tok för många datorer för att skriva här

Permalänk
Medlem

Vad jag menade var att din array obs2 inte är samma array som ob2s ?
Var definerar du din obs2 array?

Är jag eftermiddags trött ?

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem

Reflektion kommer inte lösa det här åt dig, problemet är inte heller i C# utan vad du försöker åstadkomma. Först och främst så är C# Typ säkrat, Du kan inte tvinga en en annan typ en vad den typen du försöker spara i en array.

Vad du kan göra är att användare en bas klass som innehåller gemensam delar eller ett interface för samma mål som ett kontrakt, och sedan i din array så skapa du upp en lista av det kontrakt istället för typen. Sedan här i kan du spara hur många olika typer av objekt som helst så länge de uppfyller ditt kontrakt. T.ex. en bas klass är 'Object'.

Jag vet personligen inte alls egentligen vad du försöker åstadkomma men jag har en känsla att problemet ligger i design valet.

Visa signatur

Speldator: i7-8700k, 32GB DDR4, RTX2080
Server 1: SB 2500k, MZI -P67GD55, 32GB DDR3, Corsair MX 240GB SSD
Surface Pro 2017, Konsoler: Typ alla, Oculus Rift

Permalänk
Medlem
Skrivet av MugiMugi:

Reflektion kommer inte lösa det här åt dig, problemet är inte heller i C# utan vad du försöker åstadkomma. Först och främst så är C# Typ säkrat, Du kan inte tvinga en en annan typ en vad den typen du försöker spara i en array.

Vad du kan göra är att användare en bas klass som innehåller gemensam delar eller ett interface för samma mål som ett kontrakt, och sedan i din array så skapa du upp en lista av det kontrakt istället för typen. Sedan här i kan du spara hur många olika typer av objekt som helst så länge de uppfyller ditt kontrakt. T.ex. en bas klass är 'Object'.

Jag vet personligen inte alls egentligen vad du försöker åstadkomma men jag har en känsla att problemet ligger i design valet.

Jo, det är så jag också tänker.
Försöker dock hitta ett litet hål.
Jag har runt 250 objekt som hämtas dynamiskt från 3:e part, och 3:e part lägger ibland till lite nya objekt.

Men det är väl bara att bita i sura äpplet och börja bygga, strunta i tankar på en skum genväg.

Visa signatur

På tok för många datorer för att skriva här

Permalänk
Medlem

Sorry om jag är lite trög, men jag tror inte jag förstår vad du försöker göra/vad problemet är?

Du har två klasser, O1 och O2. O2 kan du inte ändra i. O1 extendar O2.

Och där tar det stopp. Vad menar du med extendar? Att den ärver eller något helt annat? Gissar på något annat eftersom det funkar om den ärver.. menar du att den kanske har metoder med samma namn som O2 och att du skulle vilja använda den som en O2 fast med annan implementering? Och du vill trots det inte ärva O1 från O2 eftersom du har O3, O4 osv oxå som iof har samma metodnamn, men inte något gemensamt interface. Isf borde det gå o fixa med något fult fulhack tror jag, men får nog ha lite mer info först.. Nästan allt går att göra på nått sätt, bara det att det ofta är ganska fult

Visa signatur

AK47s for everyone! - Angry mob
Since NaN /= NaN, I think, we should decipher 'NaN' as 'Not a NaN' - Miguel Mitrofanov
(Varför är människan så benägen att tro på Gud?) Antagligen har det lönat sig och evolutionen har drivit fram sådana hjärnor. - Anon