Avatar billede nielslbeck Nybegynder
30. juni 2005 - 09:16 Der er 22 kommentarer og
2 løsninger

Metodens argumenter fra attribut

Er det fra en attribut muligt at finde de aktuelle parametre for et kald til metoden som attributten sidder på?
Avatar billede wisen Nybegynder
30. juni 2005 - 09:23 #1
Nej, ikke mig bekendt. Som jeg har forstået det, så bruger man attributterne til at dekorere metoder sådan at man via reflection kan få nogle ekstra informationer.
Avatar billede arne_v Ekspert
30. juni 2005 - 09:28 #2
det kan vel lade sig gøre

et eller andet GetType giver en Type
Type GetMethods giver MethodInfo[]
dem itererer man over
MethodInfo GetCustomAttributes giver Object[]
dem itererer man over
er der en matchende attribut så
MethodInfo GetParameters giver ParemeterInfo[]
som du så kan iterere over
Avatar billede nielslbeck Nybegynder
30. juni 2005 - 09:30 #3
Yeps, tænkte også på noget i den stil... men problemet må nok siges at være "et eller andet GetType giver en Type"... for hvad er "et eller andet"?
Avatar billede arne_v Ekspert
30. juni 2005 - 09:32 #4
du må vel have en eller anden kontekst

hvor du har et eller andet Object
Avatar billede nielslbeck Nybegynder
30. juni 2005 - 09:34 #5
Ja, det må jeg jo... ved bare ikke helt hvor jeg finder den kontekst - så det er egentlig den jeg er ude efter :-)
Avatar billede arne_v Ekspert
30. juni 2005 - 09:35 #6
this måske ?
Avatar billede arne_v Ekspert
30. juni 2005 - 09:36 #7
eller er vi ovre i noget:

StackTrace
GetFrame
GetMethod
GetCustomAttributes & GetParameters
Avatar billede nielslbeck Nybegynder
30. juni 2005 - 09:37 #8
Læste lige din første kommentar igen, Arne, og for at være helt sikker på at vi snakker om det samme så er problemet, at hvis jeg har følgende:

[Attribut()]
public void Hello(string att1, int att2) {...}

og så kalder:

Hello("hejsa", 1);

Så vil jeg fra min attribut gerne kunne finde ud af, at att1 er lig "hejsa" og att2 er lig 1.
Avatar billede nielslbeck Nybegynder
30. juni 2005 - 09:38 #9
Hmm... stacktraces kan vel ikke bruges, da metoden vel ikke rigtig er kaldt før jeg får udført min attribut?
Avatar billede arne_v Ekspert
30. juni 2005 - 09:41 #10
ah - du vil hvad der bliver kaldt med

inden du kalder ?

så tror jeg at jeg vil give wisen ret
Avatar billede nielslbeck Nybegynder
30. juni 2005 - 09:43 #11
Ja, faktisk... så tror heller ikke selv helt på det. Men ville gerne kunne gå ind og kigge på parametrene for kaldet og så f.eks. "afbryde" kaldet hvis parametrene ikke er gyldige. Lyder nok lidt mærkeligt - men der er også mere i det end som så :-)
Avatar billede nielslbeck Nybegynder
30. juni 2005 - 10:04 #12
Øv øv... nå, men kom I bare begge to med et svar...
Avatar billede wisen Nybegynder
30. juni 2005 - 10:17 #13
1 stk. svar
Avatar billede arne_v Ekspert
30. juni 2005 - 10:30 #14
for at kunne gøre det tror jeg at du skal over i noget AOP

så kan du få udført noget kode i forbindelse med kaldet

og svar
Avatar billede nielslbeck Nybegynder
30. juni 2005 - 10:31 #15
AOP? Jeg koder i beta 2 af .NET 2.0, så tænkte også på noget MSBuild...
Avatar billede arne_v Ekspert
30. juni 2005 - 10:33 #16
AOP = Aspect Oriented Programming
Avatar billede nielslbeck Nybegynder
30. juni 2005 - 10:36 #17
Siger mig ikke lige så meget... kan du fortælle en lille smule om det? :-)
Avatar billede arne_v Ekspert
30. juni 2005 - 10:36 #18
Jeg har kun leget med AspectJ i Java.

Eksempel på parameter check:

public class IntMath {
    public static int add(int a, int b) {
        return (a + b);
    }
    public static int subtract(int a, int b) {
        return (a - b);
    }
    public static int multiply(int a, int b) {
        return (a * b);
    }
    public static int divide(int a, int b) {
        return (a / b);
    }
}

public class DoubleMath {
    public static double add(double a, double b) {
        return (a + b);
    }
    public static double subtract(double a, double b) {
        return (a - b);
    }
    public static double multiply(double a, double b) {
        return (a * b);
    }
    public static double divide(double a, double b) {
        return (a / b);
    }
}

aspect Check {
    pointcut mathcheck() :
        call(public * *.divide(*, *));
    before() : mathcheck() {
        Object[] o = thisJoinPoint.getArgs();
        String divtyp = o[1].getClass().getName();
        if(divtyp.equals("java.lang.Integer")) {
            if(((Integer)o[1]).intValue() == 0) {
                System.out.println("About to divide by zero");
            }
        }
        if(divtyp.equals("java.lang.Double")) {
            if(((Double)o[1]).doubleValue() == 0.0) {
                System.out.println("About to divide by zero");
            }
        }
    }
}

desværre er der mig bekendt ikke nogle AOP frameworks for .NET som er ligeså
mature som AspectJ til Java.

det bedste jeg har set (men ikke prøvet at kode med endnu) er AspectDNG.
Avatar billede nielslbeck Nybegynder
30. juni 2005 - 10:38 #19
Ser interessant ud... men tror jeg må finde en anden løsning. Tak for hjælpen.
Avatar billede arne_v Ekspert
30. juni 2005 - 10:41 #20
AOP drejer sig om at ligge nogle egenskaber ind i mange klasser og disse klasser
er ikke nødvendigvis relateret til hinanden som i klassisk "is a" arv
Avatar billede burningice Nybegynder
30. juni 2005 - 10:48 #21
Avatar billede burningice Nybegynder
30. juni 2005 - 10:49 #22
ContextBoundModel implementerer kun intercept-konceptet, men det er, hvad jeg kan forstå, også det du har brug for.
Avatar billede burningice Nybegynder
30. juni 2005 - 10:50 #23
der findes også NAop, men jeg ved ikke hvor mature det er.
Avatar billede nielslbeck Nybegynder
30. juni 2005 - 13:26 #24
ContextBoundModel var faktisk lige hvad der skulle til for at løse mit problem, tak :-)
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