Avatar billede the_ghost Nybegynder
13. oktober 2007 - 18:58 Der er 4 kommentarer

Generisk operator problem

Hejsa,

Jeg er stødt ind i et lille problem, som jeg håber at der er en derude, der kan hjælpe mig lidt med :)

Jeg har en klasse ved navn HttpParameter. Den klasse indeholder bl.a. metoden:
public T ToEnum<T>() {
T OResult = default(T);
Type OType = typeof(T);
if (FValue != null && OType.IsEnum && IsNumeric()) {
  try {
  T OValue = (T)Enum.Parse(OType, FValue);
  }
  catch(ArgumentException) { //FValue does not exists in the enum
  }
}
return OResult;
}

Metoden bruges til at parse værdien i HttpParamter instancen til en Enum.
Jeg vil så gerne have lavet det således, at man ikke direkte behøver at kalde metoden. Derfor har jeg prøvet at lave:
public static implicit operator T(HttpParameter param) {
return param.ToEnum<T>();
}

Problemet her er at jeg får at vide, at den ikke kan finde typen eller namespacet 'T'.
Jeg kan ikke rigtigt se andre måder at lave metoden på, så derfor vil jeg lige høre om I har nogle idéer.

På forhånd mange tak.
Avatar billede kalp Novice
13. oktober 2007 - 20:23 #1
hvis metoden er static så skal dine members af klassen også være det:)
Avatar billede the_ghost Nybegynder
13. oktober 2007 - 20:29 #2
ToEnum() metoden er ikke statisk, men det er operator metoden.
Så problemet burde ikke ligge der.

Et eks. på hvad jeg kan nu:
enum Hep {Hej = 1, Med = 2, Dig = 3}
Hep hepEnum = new HttpParameter("key")ToEnum<Hep>();

Et eks. på hvad jeg gerne vil kunne:
enum Hep {Hej = 1, Med = 2, Dig = 3}
Hep hepEnum = new HttpParameter("key");
Avatar billede arne_v Ekspert
14. oktober 2007 - 03:04 #3
Jeg har lidt svært ved at gennemskue din kode.

Følgende virker fint hos mig:

using System;

namespace E
{
    public enum OTT
    {
        One = 1,
        Two = 2,
        Three = 3
    }
    public class Wrapper<T>
    {
        private string s;
        public Wrapper(string s)
        {
            this.s = s;
        }
        public T ToEnum()
        {
            return (T)Enum.Parse(typeof(T), s);
        }
        public static implicit operator T(Wrapper<T> o)
        {
            return o.ToEnum();
        }
    }
    public class Program
    {
        public static void Main(string[] args)
        {
            OTT v1 = (new Wrapper<OTT>("Two")).ToEnum();
            Console.WriteLine(v1);
            OTT v2 = new Wrapper<OTT>("Two");
            Console.WriteLine(v2);
            Console.ReadKey();
        }
    }
}
Avatar billede the_ghost Nybegynder
14. oktober 2007 - 09:45 #4
Pointen med HttpParameter klassen er at den bl.a. bliver brugt til at representere en querystring variable.
På nuværende tidspunkt har jeg så mulighed for, implicit at caste klassen til den type der nu er brug for.
Eks.:
HttpParameter param = new HttpParameter("var"); //finder selv FValue
int id = param;
byte age = param;
Guid uid = param;
etc.

Jeg vil derfor helst undgå at gøre hele klassen generisk (som den er i dit eksempel). Men samtidig vil jeg gerne have mulighed for, implicit at caste klassen til en enum af en given type. Jeg ved dog ikke om dette er muligt via en implicit operator overload, når selve klassen ikke er generisk.

Håber dette kan lidt bedre kan opklare, hvad mit spørgsmål reelt set går ud på. :-))
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