Avatar billede kojak99 Nybegynder
03. november 2006 - 10:25 Der er 8 kommentarer og
2 løsninger

Konvertere til Object og tilbage

Jeg har tre klasser A,B og C

De har alle attributten 'name'

Jeg skal overføre et objekt til en funktion og da de ikke stammer fra
nogen grundklasse overfører jeg dem som Object o.

Hvordan får jeg nu fat i 'name' inde i funktionen? jeg ved den findes på
objektet, men jeg ved ikke om det skal castes som A,B eller C

Hvis jeg bruger getType kan jeg godt få at vide hvilken type det er, men hvordan får jeg så dynamisk oprettet et object af denne type ?
Avatar billede spif2001 Nybegynder
03. november 2006 - 10:29 #1
Du burde kunne få dem således:

string name = "";
if(o.GetType() == typeof(A))
  name = ((A)o).Name;
else if.....
Avatar billede kojak99 Nybegynder
03. november 2006 - 10:38 #2
Problemet er at jeg så skal lave en switch-agtig ting. Havde håbet at jeg blot kunne få et objekt af typen o.getType, når den nu ved hvad typen er.
Avatar billede spif2001 Nybegynder
03. november 2006 - 10:43 #3
Nedarving må så være din redning.

Lav en klasse Super, som både A, B og C nedarver fra.

Super klassen har Name attributten.

SÅ kan du i din funktion tage Super ind i stedet for object:

public void func(Super super)
{
  string name = super.Name.
}
Avatar billede spif2001 Nybegynder
03. november 2006 - 10:44 #4
Hvis du allerede nedarver fra noget andet, kan det også lade sig gøre med et interface.
Avatar billede hacked Nybegynder
03. november 2006 - 15:07 #5
Den bedste løsning er den som spif2001 giver!

Du kan godt kalde din Name-property med InvokeMember på dit objekt, men den løsning er ikke at foretrække.
Avatar billede kojak99 Nybegynder
03. november 2006 - 15:49 #6
malkor: Kan du uddybe lidt hvordan jeg får fat i name-property vha InvokeMember og hvorfor det ikke er at foretrække.
Avatar billede hacked Nybegynder
03. november 2006 - 21:00 #7
Selvfølgelig.

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace TestNameSpace
{
    public class TestObject
    {
        private string name;

        public TestObject(string name)
        {
            this.name = name;
        }

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

    }

    public class TestKlasse
    {

        public void TestMethod(object obj)
        {
            Console.WriteLine((string)obj.GetType().InvokeMember("Name", BindingFlags.GetProperty, null, obj, null));
            Console.ReadLine();
        }

        public static void Main()
        {
            TestKlasse t = new TestKlasse();
            TestObject obj = new TestObject("Benny");
            t.TestMethod(obj);
        }
    }
}

InvokeMember ryger efter mening ind under Reflection. Du kalder kode dynamisk ved brug af Reflection. Generelt giver Reflection en smule overhead. Du vil dog ikke kunne mærke det idet dit scenarie er simpelt.

Efter min mening bør man anvende arv, hvis nogle af ens klasser har en fællesnævner. Ved at oprette en superklasse, som de 3 andre klasser arver fra opnår du reduktion af kode.
Fremfor 3 instansvariabler, 3 properties og 3 metoder behøver du kun 1 instansvariabel, 1 property og en 1 metode. Det skaber samtidig overblik over hvilke typer metoden kan modtage. En superklasse siger mere end object som kan være hvad som helst. Derved undgår du og andre at få unødvendige fejl.
Efter mit hoved er det god kodestandard :)

Det er selvfølgelig i sidste ende op til een selv :)

Eksempel på fællesnævner:
Værktøj - Hammer, Boremaskine, Høvl

De har sandsynligvis alle en pris og et navn.
Avatar billede kojak99 Nybegynder
05. november 2006 - 21:33 #8
Tak for kommentarerne. Kan I ikke oprette dem som svar, så jeg kan uddele nogle point.
Avatar billede hacked Nybegynder
06. november 2006 - 00:22 #9
Hermed et svar :)
Avatar billede spif2001 Nybegynder
06. november 2006 - 08:54 #10
svar :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester