Avatar billede jonas_h Nybegynder
18. februar 2009 - 21:18 Der er 7 kommentarer

Returnering af generisk metode.

Jeg har lidt problemer ved brug af en generisk klasse:

Har denne abstrakte klasse:
    public abstract class BaseFieldValue<DataType>

Denne har nogle sub-classes i stil med:
    public class FieldValueString : BaseFieldValue<string>
eller
    public class FieldValueInt : BaseFieldValue<int>
osv osv.

Jeg skal nu lave en factory metode som returnerer bestemte instanser ud fra en datatype:

public static BaseFieldValue<????> GetFieldValue(string stringValue, DataTypes dataType)
        {
            switch (dataType)
            {
                case DataTypes.TEXT:
                    return new FieldValueString("test");
                    break;
                case DataTypes.NUMBER
                    return new FieldValueInt("test");
                    break;
            }

            return null;
        }

Men i selve metodesignaturen, havd skal metoden returnere? Er der én overklasse til alle de simple datatyper?
Avatar billede jonas_h Nybegynder
18. februar 2009 - 21:37 #1
Hmm, nu når jeg ser på løsningen kan jeg se at den skal laves lidt om.

Jeg skal på en eller anden måde have et interface eller super-class som ikke bruger den generiske DataType da denne kan være forskellig alt efter hvad der returneres. Men alligevel skal dette interface have en metode som returnerer en værdi som netop er af typen "DataType".
Nogle som har et forslag til en fremgangsmåde/løsnign?
Avatar billede arne_v Ekspert
18. februar 2009 - 21:38 #2
Det mener jeg ikke at du kan. BaseFieldValue<string> og BaseFieldValue<int> deler ikke nogen super klasse.

Men kan du ikke lade dem implementere et ikke generisk interface ?

Eller bruge en factory metode hvor typen ikke er en enum i argument listen men en regulaer angivelse af generic type ?
Avatar billede arne_v Ekspert
18. februar 2009 - 21:46 #3
Det sidste er nemmest illustreret hvis du dropper abstract og sub klasser:

        public static BaseFieldValue<T> GetFieldValue<T>(string s)
        {
            return new BaseFieldValue<T>(s);
        }

kaldt som:

GetFieldValue<int>("Test")
Avatar billede jonas_h Nybegynder
18. februar 2009 - 22:56 #4
Pointen med min løsning er, at de senere skal bruges i liste
IList<IBaseFieldValue> values...;

Med sidstnævnte metode vil jeg jo ikke have en super-class at angive til listen.

Mht. ikke generisk interface skal dette have en property "Value" som retunerer værdien som kan være mange forskellige datatyper. Hvis interfacet ikek er generisk, vil jeg ikke kunne angive denne property. I så fald ved jeg ikke hvilken retur-type jeg skal give den.

Ved ikke om jeg simpelthen prøver at lave noge som ikke er muligt?
Avatar billede arne_v Ekspert
19. februar 2009 - 01:26 #5
Du kan have en ikke-generisk IBaseFieldValue med en Value property som altid returnerer samme type, du kan have en generisk IBaseFieldValue med en Value property som returner forskellig typer, men du kan ikke have en ikke-generisk IBaseFieldValue med en Value property som returner forskellig typer.
Avatar billede jonas_h Nybegynder
19. februar 2009 - 13:03 #6
Hmm okay... Så ser det ikke ud til, at der er en måde at løse mit problem på.

Så må jeg benytte en masse casting i stedet. Eller har du andre forslag?
Avatar billede arne_v Ekspert
20. februar 2009 - 03:29 #7
Lad mig lige tænke lidt over det
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