Avatar billede mysitesolution Nybegynder
04. april 2007 - 14:36 Der er 11 kommentarer og
1 løsning

Reflection, konverter type

Hej hvis jeg har:

class A
{
  public int i;
}

class B : A
{
}

Er det så muligt at konvertere en A til en B?

Dette er ikke muligt:

            A a = new A();

            B b = (B)a;

Men tænkte det ville være muligt med noget reflection nu hvor de indeholder samme fields?
Avatar billede kalp Novice
04. april 2007 - 14:38 #1
B b = a is B;

men tvivler:P
Avatar billede mysitesolution Nybegynder
04. april 2007 - 14:41 #2
"o is t" giver jo en bool... du mener vel "o as t" men giver samme resultat som explicit cast
Avatar billede kalp Novice
04. april 2007 - 14:51 #3
as selvfølgelig:)

men okay.. så vil jeg se om det er noget en anden løse.

normalt med arv er det jo at b kan typecastes til a men ikke omvendt.
Avatar billede mysitesolution Nybegynder
04. april 2007 - 14:59 #4
Ja i C#... det er muligt i andre sprog...
Avatar billede mysitesolution Nybegynder
04. april 2007 - 15:03 #5
Mit problem er egentlig, at jeg vil have separeret en Kernel del (udregning) og en Visual del (Tegne).

Således at jeg har:

Kernel:

Element
Divition : Element

Visual:

IVisual
VisualDivition : Divition, IVisual

som ligger i 2 forskellige assemblies
Avatar billede arne_v Ekspert
04. april 2007 - 15:04 #6
det er ikke muligt

nemmeste workaround maa vaere at lave en constrcutor for B som tager en A som argument
Avatar billede mysitesolution Nybegynder
04. april 2007 - 15:11 #7
Har virkelig brugt lang tid på at udtænke en løsning, og vil bare ikke kombinere de 2 ting.

Har denne extension method som skal retunere et IVisual objekt udfra et Element objekt. Den tjekker så om der findes en tilsvarende visuel type.

        private static Type[] visualTypes = Assembly.GetExecutingAssembly().GetTypes();

        public static IVisual ToVisual(this KB.Element e)
        {
            foreach (Type t in visualTypes)
            {
                if (t.Name == e.GetType().Name)
                {
                    return null;
                }
            }

            throw new Exception(string.Format("A visual component equalent to \"{0}\" was not found.", e.GetType().FullName));
        }

Arne_v:

Kan du så hjælpe mig med at erstatte "return null;" med et IVisual. Skal ind og have en constructor for "t" via reflection
Avatar billede mysitesolution Nybegynder
04. april 2007 - 15:54 #8
return null;

er blevet til:

                    var ctor = Array.Find(t.GetConstructors(), c => c.GetParameters().Count() == 1);

                    if (ctor == null)
                        throw new Exception("The equalent visual component does not contain a valid constructor.");

                    object result = ctor.Invoke(new[] { e });

                    return (IVisual)result;


ser ud til at virke, men virker også til at være rimelig ineffektivt
Avatar billede arne_v Ekspert
05. april 2007 - 02:12 #9
et alternativ var Assembly CreateInstance
Avatar billede arne_v Ekspert
05. april 2007 - 02:12 #10
men reflection er altid relativt langsomt !
Avatar billede mysitesolution Nybegynder
16. april 2007 - 00:22 #11
opretter du svar?
Avatar billede arne_v Ekspert
16. april 2007 - 00:59 #12
ok
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