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 :

Custom attribute et reflection


Sujet :

C#

  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 486
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 486
    Points : 2 082
    Points
    2 082
    Par défaut Custom attribute et reflection
    Bonjour,

    Je cherche a remplacer la valeur d'un membre (prive) dans un custom attribute via Reflection, mais je bute sur un probleme de sauvegarde de la modification.

    En gros, j'ai un custom attribute defini ainsi (je n'ai pas la main sur le source d'ou la modification au runtime) :
    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
    public class CustomAttribute : Attribute
    {
    	private string myValue;
     
    	public CustomAttribute(string myValue)
    	{
    		this.myValue = myValue;
    	}
     
    	public string MyValue
    	{
    		get
    		{
    			return this.myValue;
    		}
    	}
    }
    Jusqu'a present j'appliquais le CustomAttribute a mon assembly comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [assembly: CustomAttribute("value")]
    De cette valeur depend un tas de choses, mais je ne veux pas avoir "value" dans du code compile et souhaite le sortir dans le app.config.

    Recuperation du CustomAttribute et du membre prive myValue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /*Assembly currentAssembly initialise via Assembly.GetEntryAssembly*/
    CustomAttribute attribute;
    object[] attributes = currentAssembly.GetCustomAttributes(typeof(CustomAttribute), false);
                    if (attributes.Length == 1)
                    {
                        attribute = (CustomAttribute)attributes[0];
                    }
     
    typeof(CustomAttribute)
                    .GetField("myValue", BindingFlags.Instance | BindingFlags.NonPublic)
                    .SetValue(attribute, "differentValue");
    Cependant, quand la librairie qui se base sur cet attribut va recuperer la valeur MyValue, c'est la valeur "value" qui lui est retournee.

    Si vous un avis sur le probleme, je suis toute ouie.

  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 : 42
    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 749
    Points
    39 749
    Par défaut
    Ce que tu cherches à faire est impossible, on ne peut pas modifier les métadonnées à l'exécution. A chaque fois que tu appelles GetCustomAttributes, tu obtiens une nouvelle copie de l'attribut ; l'original n'est donc jamais modifié.

    Pourquoi ne pas plutôt changer le code qui utilise cet attribut, de façon à ce qu'il utilise la valeur qui se trouve dans app.config ?

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 486
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 486
    Points : 2 082
    Points
    2 082
    Par défaut
    Merci pour cette reponse, c'est ce que je redoutais.

    Justement, je n'ai pas la main sur le code qui utilise cet attribut donc je cherchais un moyen alternatif d'y affecter une valeur. Tant pis.

    A la base la valeur "value" est un chemin vers un fichier de config de la lib. La personne qui a code cette librairie n'a peut-etre pas pense que c'etait une mauvaise idee de devoir livrer une nouvelle release pour changer un chemin.

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

Discussions similaires

  1. [JAXB 2.0] customization attribute
    Par noOneIsInnocent dans le forum Persistance des données
    Réponses: 1
    Dernier message: 26/06/2008, 10h06
  2. Injecter un Custom Attribute
    Par Bluedeep dans le forum Framework .NET
    Réponses: 2
    Dernier message: 19/11/2007, 16h27
  3. Injecter un custom attribute
    Par Bluedeep dans le forum C#
    Réponses: 3
    Dernier message: 11/11/2007, 21h45
  4. [C#] Custom attribute
    Par Mathieu.Nanoux dans le forum Framework .NET
    Réponses: 2
    Dernier message: 16/05/2007, 14h39

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