IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[C#] Reflexion attribut


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de diaboloche
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    592
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 592
    Par défaut [C#] Reflexion attribut
    Bonjour,

    Je fais une reflexion ... j'isole une proprieté de cette façon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach (ParameterInfo field in type.GetConstructors()[position].GetParameters())
    {
    ...
    }
    Cette proprieté à la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    [Attribute(ClassName="Contract", PropertyName="Signature")]
    public String test
    {
    ...
    Lorsque je suis par réflexion sur ma proprieté, je n'arrive pas à récupérer l'attribut...
    field.Attribute me renvoit "None"...

    Comment puis-je récuperer cet attribut ?

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Il faut utiliser GetCustomAttributes.

    En effet, Attribute ne renvoie que des attributs "natifs" : public, protected, etc ....

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Dans ton foreach tu récupères les paramètres du constructeur, pas les propriétés de la classe...
    Ton code serait utile si ton constructeur ressemblait à ça:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public MaClasse([Attribute(ClassName="Contract", PropertyName="Signature")] string test)
    {
       ...
    }
    Mais de toutes façons je ne pense pas que ces attributs puissent être appliqués à des paramètres de méthode.
    Il me semble que tu devrais plutôt faire quelque chose comme ça:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach(PropertyInfo prop in type.GetProperties())
    {
        // ici tu testes les attributs de la propriété
    }

  4. #4
    Membre éclairé Avatar de diaboloche
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    592
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 592
    Par défaut
    Merci.

    Si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    field.GetCustomAttributes(true);
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    field.GetCustomAttributes(false);
    Je n'ai tjrs pas mon attribut. Je suppose qu'il faut spécifier le type donc ? Comment puis-je connaitre le type de cet attribut ?

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Fais voir:
    - le code de la classe sur laquelle tu fais la réflexion (juste les parties utiles)
    - le code que tu utilises pour tester les attributs
    On trouvera peut-être ce qui va pas...
    EDIT: et au fait, c'est quoi cet attribut que tu utilises ? La classe "Attribute" existe dans le framework, mais elle est abstraite... Tu as créé ta propre classe d'attribut ?

  6. #6
    Membre éclairé Avatar de diaboloche
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    592
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 592
    Par défaut
    La classe de def de mon attribut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    using System;
    using System.Text;
     
    namespace Attributes
    {
        [AttributeUsage(AttributeTargets.Property,AllowMultiple=false,Inherited=false)]
        public class DomainModelMappingAttribute : Attribute
        {
            private string _className;
            private string _propertyName;
     
            public string ClassName
            {
                get
                {
                    return _className;    
                }
                set 
                {
                    _className = value;
                }
            }
     
            public string PropertyName
            {
                get
                {
                    return _propertyName;
                }
                set
                {
                    _propertyName = value;
                }
            }
        }
    }
    La classe sur laquelle je fais ma reflexion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
     
    using System;
    using System.Xml;
    using System.Xml.Serialization;
    using System.IO;
    using System.Collections;
    using System.ComponentModel;
     
    namespace struct
    {
     
    	[Serializable()]
    	public class slsses: SAbContract
    	{		
    		[DomainModelMappingAttribute(ClassName="LossesContract", PropertyName="SignatureDate")]		
    		public SDateTime signatureDate
    		{
    			get
    			{
    				return p_signatureDate;
    			}
    			set
    			{
    				p_signatureDate = value;
    			}
    		}
    		private SDateTime p_signatureDate = null;
     
    		[DomainModelMappingAttribute(ClassName="LossesContract", PropertyName="Versions")]		
    		public SLossesCtrVersArrayList versions
    		{
    			get
    			{
    				return p_versions;
    			}
    			set
    			{
    				p_versions = value;
    			}
    		}
    		private SLossesCtrVersArrayList p_versions = new SLossesCtrVersArrayList();
     
    		[DomainModelMappingAttribute(ClassName="LossesContract", PropertyName="Lots!!!")]		
    		public SLossesLotArrayList lots
    		{
    			get
    			{
    				return p_lots;
    			}
    			set
    			{
    				p_lots = value;
    			}
    		}
    		private LossesLst p_lots = new SLossesLotArrayList();
     
    		public SLossesContr() : base()
    	   	{
      	   	}
     
     
    	}
     
     
        }
     
    }
    Ma reflexion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    foreach (Type type in _assembly.GetTypes())
                {                
                    if (type.Name == msgName)
                    {
     
                        int position = 0;
                        foreach (ConstructorInfo element in type.GetConstructors())
                        {
                            if (type.GetConstructors()[0].GetParameters().LongLength == 0)
                            {
                                if (type.GetConstructors().LongLength > 1)
                                {
                                    position = 1;
                                }
                            }
                        }
                        foreach (ParameterInfo field in type.GetConstructors()[position].GetParameters())
                        {
                            bool sub = false;
                            string parameterType = field.ParameterType.UnderlyingSystemType.FullName;
     
                            if (!sub)
                            {
                                Ct.FieldSecurity fieldObject = new Ct.FieldSecurity();
     
                                fieldObject.FieldName = prefix + field.Name;                            
     
                                //TODO                               
                                field.GetCustomAttributes(typeof(DomainModelMappingAttribute), false);
     
                                fieldObject.ClassName = "className";
                                fieldObject.PropertyName = "propertyName";  
     
                                rply.Add(fieldObject.FieldName, fieldObject);
                            }
                            else
                            {
                                prefix = oldPrefix;
                            }
                        }                    
                    }
                }
    ... j'ai essayé plusieurs choses, mais je n'arrive pas à le recuperer...

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Heu, j'ai du mal à saisir la relation entre un getconstructor() et des attributs appliqué à des propriétés.

    Dans ta classe marqué, seul les propriétés sont marquées par l'atribut, ni les champs correspondant, ni le constructeur, seulement les propriétés, donc il faut agir en consequence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                Type t = typeof(slsses);
                object[] oA;
     
                foreach (PropertyInfo info in t.GetProperties())
                {
                    if ((oA = info.GetCustomAttributes(typeof(DomainModelMappingAttribute), false)).Length > 0)
                    {
                        DomainModelMappingAttribute att = oA[0] as DomainModelMappingAttribute;
                        //ici tu sais que la propriété est marquée et tu as son attribut
                    }
                }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] Reflexion attribut
    Par diaboloche dans le forum C#
    Réponses: 2
    Dernier message: 30/11/2007, 12h24
  2. Filtre d'affichage de balise selon leur attributs
    Par Norely dans le forum XML/XSL et SOAP
    Réponses: 10
    Dernier message: 03/04/2003, 14h33
  3. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39
  4. Lire un attribut dans un fichier XML en C++
    Par ti.k-nar dans le forum XML
    Réponses: 2
    Dernier message: 14/10/2002, 15h22
  5. comment changer d'attribut de fonte dans un Tlabel?
    Par sb dans le forum Composants VCL
    Réponses: 3
    Dernier message: 21/08/2002, 16h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo