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

C# Discussion :

CustomAttribute PropertyInfo SetValue


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 57
    Points : 35
    Points
    35
    Par défaut CustomAttribute PropertyInfo SetValue
    Bonjour,
    je possède une classe à laquelle j'ai rattaché des costums attribute.
    Ces attributs ont une valeur par défaut que je changerai au fur et à mesure j'instancie ma classe.
    Mon problème, c'est que je n'arrive pas à changer ces valeurs par défaut.

    voici ce que je fais

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
     
    public class ClsDataBaseElement
    	{
     
    		private string s_User;
    		protected string s_Pwd;
    		protected string s_CheminIP;
    		protected string s_CheminDivers;
    		protected string s_DataBaseType;
    		protected string s_FileExtension;
    		protected Int32 iType;
    		public ClsDataBaseElement(string col)
    		{
    		}
    		/// <summary>
    		/// Constructeur de la classe des éléments d'une base des données
    		/// </summary>
    		private ClsDataBaseElement()
    		{
    			Int32 i =0;
    			Type MyType = typeof(ClsDataBaseElement);
     
     
     
    			PropertyInfo[] LProp = MyType.GetProperties();
     
    			foreach (PropertyInfo Pi in LProp)
    			{
     
    				Attribute[] atrib=Attribute.GetCustomAttributes(Pi,typeof(CpropertyRequired));//          GetCustomAttributes(Pi,typeof(CpropertyRequired));
    				object[] Obj = Pi.GetCustomAttributes(typeof(CpropertyRequired),true);
    				if (Pi.IsDefined(typeof(CpropertyRequired),true))
    				{
    					object o = Activator.CreateInstance(typeof(ClsDataBaseElement),new object[]{"TEST"});
    					CpropertyRequired Oprop = Obj[0] as CpropertyRequired;
    					Oprop.Required = true;
    					System.Windows.Forms.MessageBox.Show(Pa.ToString());
    					Pi.SetValue(o,Oprop,null);
    				}
     
     
    			}
    		}
    		/*public static void InitDefaults(this object o)
    		{
    		}*/
    		public static ClsDataBaseElement ParseForElement()
    		{
    			ClsDataBaseElement od = new ClsDataBaseElement();
    			return od;
    		}
    		public string p_s_DataBaseType
    		{
    			get {return this.s_DataBaseType;}
    			set {this.s_DataBaseType = value;}
    		}
    		[CpropertyRequired(false)]
    		public string p_s_UserName
    		{
    			get {return this.s_User;}
    			set {this.s_User = value;}
    		}
    		[CpropertyRequired(false)]
    		public string p_s_Password
    		{
    			get {return this.s_Pwd;}
    			set {this.s_Pwd = value;}
    		}
    		[CpropertyRequired(false)]
    		public string p_s_CheminIp
    		{
    			get {return this.s_CheminIP;}
    			set {this.s_CheminIP = value;}
    		}
    		[CpropertyRequired(false)]
    		public string p_s_CheminDivers
    		{
    			get {return this.s_CheminDivers;}
    			set {this.s_CheminDivers = value;}
    		}
    		public Int32 p_i_Type
    		{
    			get {return this.iType;}
    			set {this.iType = value;}
    		}
    		[CpropertyRequired(false)]
    		public string p_s_FileExtension
    		{
    			get { return this.s_FileExtension;}
    			set { this.s_FileExtension = value;}
    		}
    		public string GetElementType
    		{
    			get {return this.s_DataBaseType;}
    		}
    	}
    	#region "Attribut de la classe"
    	[AttributeUsage(AttributeTargets.Property,AllowMultiple = false)]
    	public class CpropertyRequired : System.Attribute
    	{
    		public Boolean Required= false;
    		public CpropertyRequired(Boolean Asaisir)
    		{
    			this.Required = Asaisir;
    		}
    	}
    	#endregion
    Si quelqu'un a une idée.

    Ne préocuppez pas du fait que je fasse cela à l'intérieur de la classe, car c'est un test. En effet si cela fonctionne, cette portion de sera projetté ailleurs. Le constructeur private n'est là que pour des questions d'accession.

    Merci. a+

  2. #2
    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
    Points : 39 753
    Points
    39 753
    Par défaut
    Ca n'a aucun sens, tu ne peux pas modifier les attributs à l'exécution.
    Enfin, tu peux peut-être modifier des propriétés d'un objet renvoyé par GetCustomAttributes, mais ça n'aura aucun effet sur le type...
    D'ailleurs un attribut est appliqué pour le type, pas pour chaque instance : il a les mêmes valeurs pour toutes les instances.

    Et de toutes façons cette ligne n'a aucun sens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pi.SetValue(o,Oprop,null);
    Ca ne peut pas marcher, à moins que la propriété représentée par Pi soit de type CpropertyRequired

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 57
    Points : 35
    Points
    35
    Par défaut
    Donc, ce que tu veux dire par là c'est que je ne peux pas modifier la valeur d'un attribut rattaché à une propriété d'une classe ?
    Si oui, alors à quoi ca sert la méthode SetValue de propertyInfo hormis la modification de sa valeur ?

    Ce que je veux c'est pour pouvoir dire à un moment donné du programme que telle propriété de la classe possède l'attribut Required à False ou à True pendant l'exécution du programme. Je ne veux pas des valeurs par défaut car on ne sait jamais.
    Y'aurait-il un autre moyen ?
    Si oui, lequel ?
    Sinon tu penses bien que l'intérêt des attributs perd tout son sens .

  4. #4
    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
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par chental Voir le message
    Si oui, alors à quoi ca sert la méthode SetValue de propertyInfo hormis la modification de sa valeur ?
    Elle ne sert à rien d'autre...

    Citation Envoyé par chental Voir le message
    Sinon tu penses bien que l'intérêt des attributs perd tout son sens .
    Ben c'est surtout que les attributs ne servent pas à ça... ce sont des méta-données statiques que tu peux ajouter aux objets du code, pour éventuellement les examiner à l'exécution, mais en aucun cas les modifier.

Discussions similaires

  1. Récupérer les valeurs dans une PropertyInfo
    Par Psycadi dans le forum C#
    Réponses: 2
    Dernier message: 13/06/2008, 12h17
  2. [Zend_Form] bouton submit, setValue impossible
    Par JuTs dans le forum Zend_Form
    Réponses: 2
    Dernier message: 06/03/2008, 02h09
  3. Reflection privée et SetValue(,)
    Par Kaidan dans le forum C#
    Réponses: 8
    Dernier message: 10/12/2007, 20h14
  4. Réponses: 4
    Dernier message: 29/05/2007, 17h04
  5. Getvalue, setvalue pour du texte
    Par duranton dans le forum wxWidgets
    Réponses: 1
    Dernier message: 19/04/2006, 16h13

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